|
redtek
金牌会员
积分 2902
发帖 1147
注册 2006-9-21
状态 离线
|
『第
16 楼』:
electronixtar兄来杯茶~~~
照着书看简直是天书,无奈还得啃下去,哈哈……
|
Redtek,一个永远在网上流浪的人……
_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._ |
|
2006-12-11 07:27 |
|
|
redtek
金牌会员
积分 2902
发帖 1147
注册 2006-9-21
状态 离线
|
『第
17 楼』:
一个可能存在危险的汇编工具
除了《轻松汇编》的汇编语言编辑工具,又看到了一个名为《至死汇编》的工具。
“这是一款全中文环境的傻瓜型DOS汇编语言辅助开发工具”……它是这样描绘其功能的。
然而,在找到数个可以下载《至死汇编》的网站后,却看到了一系列神奇的事件:
卑鄙的[编程傻瓜- 到死汇编]
天空软件站等很多网站提供了这个软件的下载,尽管软件简介天花乱坠,但用过的人就知道,请神容易送神难!不仅无法卸载,更是发现了很多用户已经发生硬盘无法访问、分区表等被删除de个案。所以,我万分谨慎的提醒大家,千万不要随便安装这个软件,除非你真的有钱,并且不在乎。
亲生测试有屎以来最无耻的软件"编程傻瓜 -
到死汇编"
软件有个许可证9.txt
竟然这样写:
4、您必须按照软件说明书中的要求及软件给您的交费提示,为您使用该软件所花的费用,在指定的日期内(此日期以您用来使用此软件的电脑上的日期为准),按指定的途径、方式来交费。
5、您不得采用任何手段来逃避交费;否则,您愿意单独全部承担由此引起的一切后果和责任。
6. 您愿意将此电脑(即:您用来执行此软件的电脑)作为财产抵押,抵押给北京军民软件园;当您违反此协议的任何条款时,则此电脑及其全部数据的财产所有权归北京军民软件园所有,北京军民软件园可以在任何时候、任何地点、以任意方式处置此电脑及其全部数据。
……总之,大至的被评论的事件就是:你装了这个软件,如果不交注册费,你的机器你的分区你就等着数据全丢吧,引导也不管用了,全被重写了。 以上贴子内容来源:
http://www.blogcn.com.cn/user1/525/archives/2005/11376.shtml
虽不能确定以上评论是真实事件还是别有用心的特殊商业竞争手段……
但,我是不敢装它了!这数据可丢不起:)
为什么这工具软件的名字居然叫《到死汇编》,哈哈……
装过的人气得快要死了吧?!
(另:以上内容只介绍了网上对《到死汇编》的部分评价,不对其介绍的真实性负责)
|
Redtek,一个永远在网上流浪的人……
_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._ |
|
2006-12-11 22:26 |
|
|
redtek
金牌会员
积分 2902
发帖 1147
注册 2006-9-21
状态 离线
|
『第
18 楼』:
【80x86汇编语言学习笔记】
领悟二进制和IP地址的关系
字: 1个字16位,其位编号为 b15~~b0。
1个字占用2个存府单元。
双字: 1个双字32位,其位编号为 b31~~b0。
1个双字占用4个存储单元。
四字: 1个四字64位,其位编号为 b63~~b0。
1个四字占用8个存储单元。 经常见到的存取信息的基本单位,英文为:Byte,就是“字节”。
一个字节由8位二进制数组成,其位编号自左至右为 b7~~b0。
(即,1个字节占用1个存储单元)
计算机中存储信息的基本单位是1个二进制位,简称:位,英文 bit,可用小写字母 b 表示,一位可存储一位二进制数。
(以上内容约为书上介绍基本概念)
(这概念有用吗?在汇编里非常有用,几乎全是这样的数据类型)
(在计算机“看来”,一切数据都是二进制信息)
(那些常用的 Windows 记事本 里看到的文本或是中文信息,那是为了给我们方便阅读,能够看得懂)
(而在计算机中,我们常称之为“文本文件”的内容,其实在计算机里都是二进制信息)
(只不过调出来为了让我们看得懂,才通过一系列“转化”和一系统“概念”,才从二进制“翻译”成我们看得明白的内容)
32位有多长?经常听到有人说:“IP地址是32位的二进制地址”。
不过,上面的定义只是网络书上或是经常有人提及的一个概念:……32位的二进制地址。
那么这个概念能不能给它“实例”化呢?
(注:以下只是个人分析,不保证个人理解和个人所说的是正确的)
例: 127.0.0.1
二进制表示这个地址: (要用 Windows Calc 计算器了,手工计算要疯掉!)
1111111.0.0.1 (二进制表示 127.0.0.1 IP地址) 但,它并不是32位的,所以左边要被位,让它为4个8位为一组。
就象是: 128,而我给128的左边加0,变成了: 00000128,那么它也是128 ~:)
01111111.00000000.00000000.00000001 (这才是32位的二进制地址的初步表示) 那么真实的32位IP地址:127.0.0.1 在计算机看来应该如何表示呢?
01111111000000000000000000000001 是上面这个样子,这才是真正的32位的二进制IP地址的书写。
在计算机看来,一切都是二进制信息,所以那个分隔的“点”就没有了~:)
为什么IP地址中间要有点儿?通过以上分析得出结论:那是为了让我们能够看懂和能够方便记忆,所以加上去的--人性化。
计算机可看不懂,它就认纯粹的二进制信息~:)
对了,现在想起了有的人(看操作象是高手的方式),有的人为了隐藏IP地址,它将IP地址“缩为”一串儿看上去很奇怪的数字。
这是为什么?
如:你会看到一些 http://2130706433
或是 Ping 2130706433
或是 Ftp …………
那就让我来揭穿,或者说从底层二进制来弄明白这个数字、这种表示方法到底是什么:)
下面是我们刚才计算出来的32位的二进制的IP地址表示:
01111111000000000000000000000001 这么长,哈哈……(该不会有人问那么"Redtek"我的名字是不是也可以用二进制表示?当然能,只是到时候我都不认识自己了:)
好,最简单的办法就是将上面的32位二进制地址计算成10进制就行了,让windows的计算器算吧~:)
打开 Windows 的计算器,选择“科学型”计算方式,在二进制那里COPY上面地址,然后点“十进制”就转出来了:)
转成十进制的地址信息如下:
2130706433 上面就是10进制的IP地址信息了,我们怎么验证它呢?
Ping 它啊~~
C:\TEMP\debug>ping 2130706433
Pinging 127.0.0.1 with 32 bytes of data:
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Ping statistics for 127.0.0.1:
Packets: Sent = 4, Received = 4, Lost = 0 (0% los
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms 看到了,只要一Ping 它,Ping 就自动转化为我们看得懂的地址信息了。
所以, Http://2130706433 当然也能~:)
而且,当你这样操作了,你就会看到浏览器的提示栏里显示“……127.0.0.1……” ~:)
等等……你想到了什么?
这是我在写另一个网志的时候想到的……“喂……你们的网址是多秒?” ……太长了……我记不住,英文字母发音也不准……
如果你将你公司的HTTP首地址写成上面的10进制地址,是不是读给客户听更方便更好记忆呢?
是不是你用手机或是移动设备浏览被你“编码”10进制的地址信息输入更方便呢?谁让手机输入数字比输入字母快~:)
(注:无独立IP的主机无效)
以上就是个人总结的关于二进制与计算机中我们常说的IP地址的关系:)
10:04 2006-12-11
另:既然我们上面聊到了 Ping ,那么 Ping 还可以干什么呢?
Ping 可以看懂10进制地址信息,那么我们让 Ping 来做翻译吧~:)
我们知道: 字母 A 的16进制是 41 ,它的10进制是 65
set /a 0x41 也可以帮我们计算出 0X41 这个16进制的10进制是 65
所以,这回我们急了!!!我们要PING 0x41
C:\TEMP\debug>ping 0.0.0.0x41
Pinging 0.0.0.65 with 32 bytes of data: Ping 帮我们把 0x41 转成了10进制数: 65,哈哈……
Ping 也可以当计算器~:)
上面的原理还是来自于二进制信息与什么是32位的二进制IP地址的我们刚才的讨论~:)
但Redtek本人不表示上面所说就一定是正确的,很可能等汇编语言完全学完以后上面的个人认为又是一种错误~:)
(另:为什么IP地址如: 127.0.0.1 这个子网的范围为什么是:0~~255呢?)
( 这是谁规定的? 为什么要这样规定? )
( 好象没人告诉我,好象就是指定这个范围 )
好,我们把这个弄清楚了~:)
IP地址是由32位的二进制地址组成。
由上面推断证明,它是每8位一组,一共四组,每组用 “点” 来隔开,为了让我们看明白:)
01111111.00000000.00000000.00000001 上面就是四组,每组8位二进制表示的IP地址。
8个位的二进制位等于一个字节的长度,
8个位的二进制数可以最大表示(10进制无符号数): 0~~255
所以,简单认为如果有一个10进制是256,那么它就超过了8位二进制所容纳的范围了(无符号数--即没有正负之分)。
255的16进制是FF。
当我们在8位寄存器中,用Debug做如下实验:
C:\TEMP\debug>debug
-a
0AF5:0100 MOV AL,100
^ Error
0AF5:0100 MOV AL,FF 把 100H (10进制的256)送入 8位的AL寄存器,结果溢出。
把 FFH (10进制的255)送入 8位的AL寄存器,刚好:)
FFH (10进制的255)转成二进制是: 11111111 (正好占8个二进制位)
100H(10进制的256)转成二进制是:100000000 (占9个二进制位,8位寄存器可放不下)
所以,取值这是样规定了从0~~255的范围刚好合适。
那么 255.255.255.255 是多大呢?
二进制表示: 11111111111111111111111111111111
它的十进制: 4294967295
相当于: 42亿多台主机……(不过这是理论值)
那么,经常遇到什么什么溢出也是这个原因~:)
[ Last edited by redtek on 2006-12-11 at 11:00 AM ]
|
Redtek,一个永远在网上流浪的人……
_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._ |
|
2006-12-11 23:12 |
|
|
redtek
金牌会员
积分 2902
发帖 1147
注册 2006-9-21
状态 离线
|
『第
19 楼』:
【80x86汇编语言学习笔记】
位和地址线究其穷破
二进制位、n位地址线……这些都是什么?它们有没有用?
书上只告诉我这样的原话:“……8088……,有20位地址线,可以寻址1MB的内存……”。
(好,我们今天非得把它弄明白了不可)
(书上一带而过,并没有说为什么20位地址线就可以寻址1MB内存,它凭什么能寻得,又凭什么寻不到1MB以上内存?)
(这20位地址线最大寻址为什么是1MB?怎么计算出来的?)
(好,我们从现在把它完全弄明白了,一直推到它的本质上~:)
(……休息,休息一会儿)
第17楼从位一直推到那个IP地址,又一直推到那个IP地址的最大表示范围。
所以,我们知道二进制表示8个位的最大数(8位寄存器也可以不溢出的情况下装入),那么这个数就是十进制的255。
转成16进制是 FF (还记得修改游戏血值为什么是FF了吧?代表最大)。
转成二进制就是 11111111 (一共有8个1,哈哈)
所以,那么20位地址如何表示呢?当然是20个1啦~:)
11111111111111111111
那么这20个1(就是二进制的20位表示)的10进制是多大呢? 1048575
(为什么要表示成10进制呢?二进制容易看晕了,不方便用windows计算器计算)
好,20位的10进制得出了是:1048575
(书上说20位地址线最大寻址为1MB内存)
好,我们再看1MB的内存计算方法:
1024个字节=1KB
1024KB=1MB
所以,1024KB是1MB,那么1MB就是1024*1024=1048576个字节
1MB是1048576个字节,那么为什么刚才计算20位最大数表示的10进制是1048575呢?它两个数可是相差1啊!
再看一下内存,内存的启址地址是从0开始的,一直到20位地址可寻范围的1048575,当然有1048576个地址表示。
而我们1024*1024所得到的内存1MB的计数,可是从1到1048576的,它们起始数不一样,当然相差1。
所以,20位地址线最大可访问内存为1MB。
[ Last edited by redtek on 2006-12-15 at 08:23 AM ]
|
Redtek,一个永远在网上流浪的人……
_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._ |
|
2006-12-12 02:13 |
|
|
redtek
金牌会员
积分 2902
发帖 1147
注册 2006-9-21
状态 离线
|
『第
20 楼』:
【80x86汇编语言学习笔记】
IBM PC 机的寻址方式与指令系统
与数据有关的寻址方式包括:
1) 立即寻址方式
2) 寄存器寻址方式
3) 直接寻址方式
4) 寄存器间接寻址方式
5) 寄存器相对寻址方式
6) 基址变址寻址方式
7) 相对基址变址寻址方式
8) 比例变址寻址方式
“ 一条指令通常由操作码域和操作数域两部分组成。 ”
“ 寻址方式指的就是指令按什么方式寻找到操作数地址或操作数。 ”
EA=有效地址。
在IBM PC中就是操作数地址的偏移量部分。(简称EA)
“ EAX、AX、AL(通常被分为32位、16位、8位累加器),它们在乘除、十进制运算、输入输出指令中有专门用途。 ”
“ 在实模式中BX、BP、SI、DI可以作为间接寻址的寄存器,用以寻址64KB以内的内存单元。 ”
1) 理解立即寻址方式
Quote: | -A
0AF7:0100 MOV AL,6 ; 结果 (AL) = 6 , 6是立即数
0AF7:0102 MOV AX,1234 ; 结果 (AX) = 1234H , 1234H是立即数
0AF7:0105
-T=100
AX=0006 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0AF7 ES=0AF7 SS=0AF7 CS=0AF7 IP=0102 NV UP EI PL NZ NA PO NC
0AF7:0102 B83412 MOV AX,1234
-T
AX=1234 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0AF7 ES=0AF7 SS=0AF7 CS=0AF7 IP=0105 NV UP EI PL NZ NA PO NC |
|
2) 理解寄存器寻址方式
例: MOV BX,AX ; 执行结果(BX)=(AX)
MOV DI,5678H ; 执行结果(DI)=5678H
“ 仿问普通变量时,默认选用DS段寄存器,后也可以显式地指定为ES、SS、CS(在386以上还可以为GS、FS)。”
段超越前缀的格式为: 段寄存器名:
段超越前缀的功能是明确指出本条指令所要寻址的内存单元在哪个段。
例: MOV BX,ES:MEM
“ 该指令源操作数的有效地址是用变量名表示的MEM,前边使用了段超越前缀“ES:”,明确表示使用ES所指向的附加数据段中变量,
而不是默认的DS所指向的数据段。 ”
由于汇编格式不会,下面使用Debug理解寄存器寻址方式:
Quote: | -R
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0AF7 ES=0AF7 SS=0AF7 CS=0AF7 IP=0100 NV UP EI PL NZ NA PO NC
0AF7:0100 B006 MOV AL,06
-A
0AF7:0100 MOV AX,1234
0AF7:0103 MOV BX,AX
0AF7:0105
-T=100 2
(把1234H放入AX16位寄存器中)
(将AX寄存中的值放入BX寄存器中)
AX=1234 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0AF7 ES=0AF7 SS=0AF7 CS=0AF7 IP=0103 NV UP EI PL NZ NA PO NC
0AF7:0103 89C3 MOV BX,AX
AX=1234 BX=1234 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0AF7 ES=0AF7 SS=0AF7 CS=0AF7 IP=0105 NV UP EI PL NZ NA PO NC |
|
3) 理解直接寻址方式
“ 操作数的有效地址直接包含在指令中的寻址方式。 ”
“ 有效地址存放在代码段的指令操作码之后,但操作数本身在存储器中,所以必须先求出操作数的物理地址。 ”
例: MOV AL,[78H]
Debug理解上面代码:
Quote: | -R
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0AF7 ES=0AF7 SS=0AF7 CS=0AF7 IP=0100 NV UP EI PL NZ NA PO NC
0AF7:0100 BF7856 MOV DI,5678
-E DS:1500 "1234"
(将字符串 “1234” 写入DS段偏移量1500H处)
-A
0AF7:0100 MOV AL,[1500]
0AF7:0103
-T=100
(MOV AL,[1500] 是将DS段偏移量1500H处的8位字符(变量)送入AL8位寄存器中)
AX=0031 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0AF7 ES=0AF7 SS=0AF7 CS=0AF7 IP=0103 NV UP EI PL NZ NA PO NC
0AF7:0103 89C3 MOV BX,AX
(显示DS段偏移量1500H处数据,其中的“31”为数字1的16进制ASCII码)
-D 1500
0AF7:1500 31 32 33 34 07 58 5F C3-33 C0 0B C9 74 4F 1E 06 1234.X_.3...tO..
0AF7:1510 1F B4 40 8B D7 83 F9 01-75 28 CD 21 1F 50 26 8A ..@.....u(.!.P&.
0AF7:1520 05 E8 5A 00 58 1E 06 1F-73 06 F8 B4 40 42 CD 21 ..Z.X...s...@B.!
0AF7:1530 9C 26 80 3D 1A 75 02 8B-C1 EB 01 CF 0E E8 FB FF .&.=.u..........
0AF7:1540 EB 1A 55 51 E8 A6 FF 8B-E9 59 CD 21 73 02 EB 0B ..UQ.....Y.!s...
0AF7:1550 3B C8 74 07 3B E8 F8 75-02 8B C1 5D 1F C3 B8 27 ;.t.;..u...]...'
0AF7:1560 00 BB 04 00 B5 01 C3 80-FE FF 74 11 F6 C6 80 75 ..........t....u
0AF7:1570 0C 1E 07 8D 3E 67 92 B9-02 00 E8 00 FF C3 06 57 ....>g.........W |
|
段超越前缀Debug表示如下:(汇编表示: MOV AL,ES:[78H] )
Quote: | -E ES:78 12
-A
0AF7:0100 ES:MOV AL,[78]
0AF7:0104
-T=100
AX=0012 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0AF7 ES=0AF7 SS=0AF7 CS=0AF7 IP=0104 NV UP EI PL NZ NA PO NC
0AF7:0104 20750A AND [DI+0A],DH DS:000A=4F
(78H处内容:)
-D 78
0AF7:0070 12 00 00 00 00 00 00 00 ........ |
|
4) 理解寄存器间接寻址方式
“ 若指令中使用的是BX、SI、DI、EAX、EBX、ECX、EDX、ESI、EDI,则缺省情况操作数在数据段。 ”
寄存器间寻址方式[BX]表示BX寄存器中是有效地址而不是操作数。
这也是寄存器间寻址方式与寄存器寻址方式在汇编格式上的区别。
例: MOV AL,[BX]
若(DS)=3000H,(BX)=78H,(30078H)=12H
则物理地址=10H*(DS)+(BX)=30078H
该指令结果是(AL)=12H
Debug 理解:
Quote: | -E DS:78 12
-A
0AF7:0100 MOV BX,78
0AF7:0103 MOV AL,[BX]
0AF7:0105
-T=100
(将地址DS:78H送入BX寄存器中)
(取BX寄存器中的地址值,送入AL寄存器中)
AX=0000 BX=0078 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0AF7 ES=0AF7 SS=0AF7 CS=0AF7 IP=0103 NV UP EI PL NZ NA PO NC
0AF7:0103 8A07 MOV AL,[BX] DS:0078=12
-T
AX=0012 BX=0078 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0AF7 ES=0AF7 SS=0AF7 CS=0AF7 IP=0105 NV UP EI PL NZ NA PO NC |
|
5) 理解寄存器相对寻址方式
“ 操作数的有效地址是一个基址(BX,BP)或变址寄存器(SI、DI)的内容和指令中给出的一个位移量(disp)之和。”
“ 对于386以上CPU,这种寻址方式允许使用任何32位通用寄存器。 ”
“ 位移量可以是1个字节、1个字、1个双字(386以上)的带符号数。 ”
“ 若指令中寄存器相对寻址方式使用BP、EBP、ESP,则默认与SS段寄存器配合。 ”
“ 使用其他通用寄存器,则默认与DS段寄存器配合,允许使用段超越前缀。”
EA=(基址<或变址>寄存器)+disp
EA=(32位通用寄存器)+disp (386以上)
Debug理解如下:
Quote: | -E 78 12
(将12H填入DS段偏移量为78H地址处)
-A
0AF7:0100 MOV BX,70
0AF7:0103 MOV AL,[BX+8]
0AF7:0106
(将70H地址送入BX寄存器中)
(取BX寄存器中地址并加位移量8,取这个地址中的值,送入AL寄存器中)
-T=100
AX=0000 BX=0070 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0AF7 ES=0AF7 SS=0AF7 CS=0AF7 IP=0103 NV UP EI PL NZ NA PO NC
0AF7:0103 8A4708 MOV AL,[BX+08] DS:0078=12
-T
AX=0012 BX=0070 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0AF7 ES=0AF7 SS=0AF7 CS=0AF7 IP=0106 NV UP EI PL NZ NA PO NC |
|
6) 理解基址变址寻址方式
“ 操作数的有效地址是一个基址寄存器(BX,BP)和一个变址寄存器(SI、DI)的内容之和。 ”
EA=(基址寄存器)+(变址寄存器)
例: MOV AL,[BX][SI]
执行结果: (DS:[BX+SI]) ---> AL
“ 使用这种寻址方式可以访问一维数组,其中BX存放数组起始地址的偏移量,SI存放数组元素的下标乘以元素的长度,下标从0计数。”
Debug理解基址变址寻址方式:
Quote: | -E DS:78 12
-A
0AF7:0100 MOV SI,8
0AF7:0103 MOV BX,70
0AF7:0106 MOV AL,[BX][SI]
0AF7:0108
-T=100
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0008 DI=0000
DS=0AF7 ES=0AF7 SS=0AF7 CS=0AF7 IP=0103 NV UP EI PL NZ NA PO NC
0AF7:0103 BB7000 MOV BX,0070
-T
AX=0000 BX=0070 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0008 DI=0000
DS=0AF7 ES=0AF7 SS=0AF7 CS=0AF7 IP=0106 NV UP EI PL NZ NA PO NC
0AF7:0106 8A00 MOV AL,[BX+SI] DS:0078=12
-T
AX=0012 BX=0070 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0008 DI=0000
DS=0AF7 ES=0AF7 SS=0AF7 CS=0AF7 IP=0108 NV UP EI PL NZ NA PO NC |
|
7) 理解相对基址变址寻址方式
“ 操作数的有效地址是一个基址(BX、BP)和一个变址寄存器(SI、DI)的内容和指令中给定的一个位移量(disp)之和。”
EA=(基址寄存器)+(变址寄存器)+disp
例: MOV AL,ARY[BX][SI]
该指令可以表示为:MOV AL,ARY[BX+SI] 或
MOV AL,[BX+SI+ARY] ---> AL
使用Debug理解例子:
Quote: | -E DS:78 12
(将12H填入DS段偏移量78H)
-A
0AF7:0100 MOV BX,70
0AF7:0103 MOV SI,4
0AF7:0106 MOV AL,4[BX+SI]
0AF7:0109
-T=100
(将地址70H送入BX寄存器)
(将地址4H送入SI变址寄存器)
(求BX寄存器内地址+SI变址寄存器内地址+位移量4H,它们相加总和地址所在的变量取出,送入AL寄存器)
AX=0000 BX=0070 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0AF7 ES=0AF7 SS=0AF7 CS=0AF7 IP=0103 NV UP EI PL NZ NA PO NC
0AF7:0103 BE0400 MOV SI,0004
-T
AX=0000 BX=0070 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0004 DI=0000
DS=0AF7 ES=0AF7 SS=0AF7 CS=0AF7 IP=0106 NV UP EI PL NZ NA PO NC
0AF7:0106 8A4004 MOV AL,[BX+SI+04] DS:0078=12
-T
AX=0012 BX=0070 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0004 DI=0000
DS=0AF7 ES=0AF7 SS=0AF7 CS=0AF7 IP=0109 NV UP EI PL NZ NA PO NC |
|
使用上面这种寻址方式可以访问形如 ARY[3][2]的二维数组,下标从0开始计数。
假设数组在内存中以行的形式存放(即先存放第一行的所有元素,然后依次存第二行……),其中ARY为数组超始地址的偏移量。
基址寄存器(例BX)为某行首与数组起始地址的距离(即BX=行下标*一行占用的字节数)。
变址寄存器(例SI)为某列与所在行首的距离(即SI=列下标*元素长度),若保持BX不变而SI改变,则访问同一行所有元素。
若保持SI不变而BX改变,则可以访问同一列的所有元素。
8) 理解比例变址寻址方式
“ 这种寻址方式是80386以上的微处理器才提供的。 ”
EA=(基址寄存器)+(变址寄存器)*比例因子+disp
(最后一种相当于第7种寻址方式的扩充,关于模拟数组的方式非常有用)
(但,如果按书 MOV EAX,ARY[EBX][ESI] 就这一句话举例一带而过的讲义方式,非常怀疑这是在简单抽象介绍还是在一步一步教学!)
(所以,如果不模拟并做出一个数组的较完整的操作代码出来,想必是白学了,不可能得心应手的使用和思维再扩展它的应用)
(暂时放在这里,等会汇完整的数组操作代码时再回过来看)
[ Last edited by redtek on 2006-12-12 at 05:40 PM ]
|
Redtek,一个永远在网上流浪的人……
_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._ |
|
2006-12-12 23:25 |
|
|
redtek
金牌会员
积分 2902
发帖 1147
注册 2006-9-21
状态 离线
|
『第
21 楼』:
【80x86汇编语言学习笔记】
(热身练习~:)
显示一个字符笑脸儿: ☺
Quote: | -A
0AF7:0100 MOV DL,1
0AF7:0102 MOV AH,2 ; 调用DOS 21中断2号功能,显示DL寄存器中字符
0AF7:0104 INT 21
0AF7:0106 INT 20
0AF7:0108
-G
☺
Program terminated normally
-U 100 106
0AF7:0100 B201 MOV DL,01
0AF7:0102 B402 MOV AH,02
0AF7:0104 CD21 INT 21
0AF7:0106 CD20 INT 20 |
|
如果没有这个热身小练习估计再看下去就疯了~:)
(上面小代码也可以在不生成临时文件的情况下自动“注入”Debug并自动生成文件)
echo exit|%ComSpec% /k prompt a$_mov dl,1$_mov ah,2$_int 21$_int 20$_$_rcx$_8$_n p.com$_w$_q$_|debug 上面代码是一行,执行后会在当前目录下生成一个名为 P.COM 的文件,一执行会显示一个笑脸儿~:)
(上面指令无论是 Windows CMD Shell 还是 MS-DOS 纯DOS环境均可以正常执行)
[ Last edited by redtek on 2006-12-12 at 06:19 PM ]
|
Redtek,一个永远在网上流浪的人……
_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._ |
|
2006-12-13 07:02 |
|
|
redtek
金牌会员
积分 2902
发帖 1147
注册 2006-9-21
状态 离线
|
『第
22 楼』:
【80x86汇编语言学习笔记】
输出 256 个ASCII码~:)
Quote: | C:\TEMP\debug>DEBUG
-A
0AF5:0100 MOV CX,0100
0AF5:0103 MOV DL,00
0AF5:0105 MOV AH,06
0AF5:0107 INT 21
0AF5:0109 INC DL
0AF5:010B LOOP 0105
0AF5:010D INT 20
0AF5:010F
-G
☺☻♥♦♣○
♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]
^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡
«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²
■ |
|
Loop 为循环指令,其循计数放在CX寄存器中。
06h DOS 21中断06H号功能:为直接控置台读/写,要输出的ASCII字符送入DL寄存器中
inc 递增指令,指定寄存器+1每次。
[ Last edited by redtek on 2006-12-14 at 05:11 PM ]
|
Redtek,一个永远在网上流浪的人……
_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._ |
|
2006-12-15 05:59 |
|
|
lxmxn
版主
积分 11386
发帖 4938
注册 2006-7-23
状态 离线
|
『第
23 楼』:
哈哈,就再这里跟着兄学习汇编了。比书上详细、好理解的多。呵呵~~
Quote: | 1024个字节=1KB
1024KB=1MB
(1MB就是1024个字节) |
|
19楼中,这里笔误了吧?
|
|
2006-12-15 08:29 |
|
|
namejm
荣誉版主
batch fan
积分 5226
发帖 1737
注册 2006-3-10 来自 成都
状态 离线
|
『第
24 楼』:
哈哈,无聊如汇编都让 redtek 兄搞得让人兴味盎然,过瘾过瘾。以后论坛里如果要开讲座的话,老兄一定是在台上先泡杯花茶然后再唾沫横飞开讲的那位,哈哈。
|
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。 |
|
2006-12-15 09:20 |
|
|
lxmxn
版主
积分 11386
发帖 4938
注册 2006-7-23
状态 离线
|
|
2006-12-15 10:30 |
|
|
redtek
金牌会员
积分 2902
发帖 1147
注册 2006-9-21
状态 离线
|
『第
26 楼』:
多谢lxmxn兄,19楼的错误去掉了~:)))
http://www.aogosoft.com/ 这个汇编网站不错,收藏:)
|
Redtek,一个永远在网上流浪的人……
_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._ |
|
2006-12-15 21:25 |
|
|
redtek
金牌会员
积分 2902
发帖 1147
注册 2006-9-21
状态 离线
|
『第
27 楼』:
有了namejm兄的鼓励,俺心中顿时暖流四起、真气充盈,突然间年轻了20年~:)
什么时候论坛开讲座,真盼着能一桌子酒……边喝边听namejm兄演讲~:)~
|
Redtek,一个永远在网上流浪的人……
_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._ |
|
2006-12-15 21:38 |
|
|
GOTOmsdos
铂金会员
C++启程者
积分 5154
发帖 1827
注册 2003-7-18
状态 离线
|
『第
28 楼』:
过来纯支持一下,偶只会操作MBR的汇编
汇编是编程语言的《易经》
|
|
2006-12-16 00:26 |
|
|
redtek
金牌会员
积分 2902
发帖 1147
注册 2006-9-21
状态 离线
|
『第
29 楼』:
“汇编是编程语言的《易经》” GOTOmsdos兄这句话说得真是贴切至极!!!欣赏!!!
|
Redtek,一个永远在网上流浪的人……
_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._ |
|
2006-12-16 02:06 |
|
|
lxmxn
版主
积分 11386
发帖 4938
注册 2006-7-23
状态 离线
|
『第
30 楼』:
Quote: | echo exit|%ComSpec% /k prompt a$_mov dl,1$_mov ah,2$_int 21$_int 20$_$_rcx$_8$_n p.com$_w$_q$_|debug |
|
我生成了这个P.COM,但是不知道专门看见这个“笑脸”。运行一闪而过,根本看不见,请教兄一下~
|
|
2006-12-16 02:27 |
|
|