轻松学汇编(1) -----By天草培训学员:anangel
标题:轻松学汇编(3) -----By天草培训学员:anangel链接:http://www.unpack.cn/viewthread.php?tid=41477
贴者:anangel
日期:2009-10-16 19:16
汇编基础知识①
1.通用寄存器:
EAX ECX EDX EBX ESP EBP ESI EDI (图1)
数据寄存器以及定义:
EAX ECX EDX EBX用来暂时存放计算过程中所用的操作数、结果或其他信息。
EAX(Accumilator):累加器,算数运算的主要寄存器
ECX(Count):计数器,在循环(LOOP)和传处理指令中用作隐含的计数器
EDX(Date):数据寄存器,一般在做双字长运算时把EDX和EAX组合在一起放一个双字长数,EDX用来存放高位数字
EBX(Base):基址寄存器,
寄存器以及定义:ESP EBP ESI EDI它们可以像数据寄存器一样在运算过程中存放操作数,但它们只能16位使用。此外它们更经常的用途是在段内寻址时提供偏移地址。
ESP(Stack Pointer):堆栈指针寄存器,表示栈顶的偏移地址。
EBP(Base Pointer):基址指针寄存器,可作为堆栈区中的基值地址以便访问堆栈中的其他信息。
ESI (Source Index):原地址指针寄存器
EDI(Destination Index):目的地址指针寄存器
ESI和EDI一般与EDS联用,用来确定数据段中某一存储单位的地址。这两个变址寄存器有自动增量和减量的功能。
2.段寄存器:
ES CS SS DS FS GS(图2)
(图2)
CS:代码段(Code Segment)
DS:数据段(Data Segment)
ES:附加数据段(Extra Segment)
SS:堆栈段(Stack Segment)
FS:附加段
GS 附加段
3.指令寄存器
EIP(Instrcution Pointer):指令指针存储寄存器,它用来存放代码中偏移地址
4. 其他16个标志位(图3)
(图3)
CF(Carry Flag):符号标志,记录运算结果的符号,结果为负数时则 1,否则0
PF(Party Flag):奇偶标志,用来为机器中传送信息时可能产生的代码出错情况听歌检验条件。当结果操作数中1的个数为偶数时置1,否则置0
AF(Assistant Flag):辅助进位标志位
ZF(Zero Flag):零标志,运算结果为0时ZF位置1,否则置0
SF(Singal Flag):符号标志,记录运算结果的符号,结果为负时置1,否则置0
IF(Interrupt Flag):中断允许标志位,由 CLI,STI两条指令来控制
DF(Direction Flag):向量标志位,由 CLD,STD 两条指令来控制
OF(Overflow Flag):溢出标志,在操作数超出了计算能表示的范围称为溢出
天草学员:anangel 2009.10.16
[ 本帖最后由 anangel 于 2009-10-27 12:04 编辑 ]
汇编基础知识②
8086处理器寻址方式1. 立即寻址(Immediate Addressing)图(1)
这种寻址方式下,操作数以常量的形式出现在指令中
举例:01.MOV CX,9;立即数9作为原操作数寄给寄存器ECX。
02.MOV AX,5807H 指令执行后EAX=5870H
2.存储器寻址
2-1直接寻址(Direct Addressing)(图2)
格式:(1)[常量]
(2)变量
直接寻址是最简单的存储寻址。这种寻址方式下,操作数的有效地址由指令直接给出,是带有方括号的常量或是变量。操作数的段地址默认为在数据段寄存器DS中,即DS为默认段寄存器
2-2寄存器间接寻址(Register Indirect Addressing)(图3)
格式:
操作数的有效地址EA由寄存器 BX BP SI DI给出。在80386下8个寄存器都可以给出
如果指令使用是 BX SI DI则操作数据段中,且用数据寄存器DS中内容为段地址。
如果指令使用是 BP 则操作数据段中,且用数据寄存器SS中内容为段地址。
举例:01.MOV AL,;设BX的内容为1000H则指令功能是将DS段1000H单元内容传送到AL中
2-3寄存器相对寻址(Register Relative Addressing) (图4)
即在寄存器间址寻址方式的基础上再加一个位移量,位移量可以是8位也可以是 16 位,比如说 MOV AX,。
(图4)
2-4基址变址寻址(Based Indexed Addressing)(图5)
格式:偏移量
其中偏移量可以是常量也可以是变量,将基址寄存器成基址+变址寄存器
在 80386 下除 ESP外的其它 7 个通用寄存器都可以作为变址寄存器
(BX) (SI)
EA= + +偏移量
(BP) (DI)
基址是BX短寄存器使用DS 基址是BP短寄存器是SS
(SI)
PA=16*(DS)+(BX)+ +偏移量
(DI)
(SI)
PA=16*(SS)+(BP)+ +偏移量
(DI)
例子:01 MOV AX,3000H
设(DS)=10000H,(BX)=0400H,(SI)=1260H
则EA=3000H+0400H+1260H==4660H
则PA=10000H+4660H=14660H
(图5)
2-5相对基址变址寻址(Relative based indexed addressing) (图6)
在基址变址寻址方式的基础上加上一位移量
当基址寄存器为BX时,使用DS为段寄存器;而当基址寄存器为BP时,则使用SS为段寄存器。
举例:01MOV BH,ES:;8 位操作,段寄存器是 ES。
02MOV DL,;8 位操作,段寄存是 SS,因为用了 EBP作为基址寄存器。
(图6)
80386知识
在保护模式下,80386 处理器可以使用所有的物理内存。段基址可以是 32 位,也可以不
是 16 的倍数,同时它的最大长度为 4G,这与 8086 完全不同,在形成逻辑地址时用段基址
直接加上段内偏移地址, 而并不将段基址左移 4 位(乘以16)。 通常情况下, 除了访问堆栈外,默认的段都为 DS,有跨段前缀就另当别论了。在以 BP,EBP,ESP作为基址寄存器时,这时默认的段寄存器应该是SS,举几个简单的例子:
MOV EAX,;这里的段寄存器是DS
MOV EAX,FS:;这里的段寄存器是 FS,因为指令中使用跨段前缀显示指定了
MOV EAX,;这里的段寄存器是SS,因为指令中使用了 BP作为基址寄存器
MOV EAX,GS:;这里段寄存器是 GS,因为指令中使用跨段前缀显示指定了
[ 本帖最后由 anangel 于 2009-10-24 20:36 编辑 ] 不错啊,来看下啊 学习编程对于我来说只能是一个梦想了,非常渴望啊,但是年纪大了,没有什么英语基础,哎,太晚了,学汇编根本不知道从哪里学起,真羡慕你们啊, 楼主写的不错.如果能加上各寻址方式的大致作用,既便于理解,更便于记忆.效果会更好! 写得很详细.... 确实是很不错,还以为附件里是这文章的word文章,原来。。。 :lol 很不错的资料,先拿来学习了,谢谢LZ分享 学习,补了下基础,多谢分享 谢谢LZ分享:) 不错..真的 呵呵,我也是天草的vip学员。
我是will。。顶下你。 温故而知新,:P 好东西啊 下来学习学习 不错啊!天草培训学员一发贴就来个精!支持!