还在苦苦敲代码开发APP?你out啦! 试试积木搭建APP吧~

汇编常用寄存器及指令基础总结

来源:清泛原创     2015-08-23 20:32:17    人气:     我有话说( 0 人参与)

8086汇编常用寄存器数据寄存器AH&AL=AX:累加寄存器,常用于运算BH&BL=BX:基址寄存器,常用于地址索引CH&CL=CX:计数寄存器,常用于计数DH...

8086汇编常用寄存器
数据寄存器
AH&AL=AX:累加寄存器,常用于运算
BH&BL=BX:基址寄存器,常用于地址索引
CH&CL=CX:计数寄存器,常用于计数
DH&DL=DX:数据寄存器,常用于数据传递
 
为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:
CS(Code Segment):代码段寄存器
DS(Data Segment):数据段寄存器
SS(Stack Segment):堆栈段寄存器
ES(Extra Segment):附加段寄存器
 
特殊功能的寄存器:
IP(Intruction Pointer):指令指针寄存器,与CS配合使用,可跟踪程序的执行过程
SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置
BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置
SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针
DI(Destination Index):目的变址寄存器,可用来存放相对于 ES 段之目的变址指针
FR(Flag Register):单独的十六位寄存器,有9个标志位,某些汇编指令(大部份是涉及比较、算术或逻辑运算的指令)执行时,会将相关标志位置1或清0, 常碰到的标志位有零标志(ZF)、符号标志(SF)、溢出标志(OF)和进位标志(CF)
 
当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器 CS,DS,SS 来指向这些起始位置。通常是将DS固定,而根据需要修改CS。
 
Inter汇编与AT&T汇编的区别
一、 大小写
INTEL格式的指令使用大写字母,而AT&T格式的使用小写字母。
INTEL :MOV EAX,EBX                  AT&T :movl %ebx,%eax  
二、 操作数赋值方向
INTEL :MOV EAX,EBX                  AT&T :movl %ebx,%eax 
三、前缀
INTEL :MOV EAX,1                      AT&T :movl $1,%eax (寄存器加%, 立即数加$)
movl value , %ebx                           value为一常数;在符号前加前缀$表示引用符号地址。
movl $value, %ebx                          将value的地址放到 ebx中。
四、间接寻址语法
INTEL:Instr foo,segreg:[base+index*scale+disp]    
AT&T:instr %segreg:disp(base,index,scale),foo  
五、 后缀
 AT&T 语法中大部分指令操作码的最后一个字母表示操作数大小, “b”表示 byte(一个字节) ;
“w”表示 word(2 个字节) ;“l”表示 long(4 个字节) 。
INTEL 中处理内存操作数也有类似的语法如:BYTE PTR、WORD PTR、DWORD PTR。
INTEL:mov al, bl                                    AT&T:movb %bl,%al 
INTEL:mov ax,bx                                   AT&T:movw %bx,%ax
INTEL:mov eax, dword ptr [ebx]          AT&T:movl (%ebx), %eax
 
 
汇编跳转指令
表1·测试标志位的JCC指令
指 令 描 述 条 件 别 名 相 反 指 令
JC 如果进位位被置位则跳转 进位标志=1 JB,JNAE JNC
JNC 如果进位位没有置位则跳转 进位标志=0 JNB,JAE JC
JZ 如果0标志被置位则跳转 0标志=1 JE JNZ
JNZ 如果0标志没有置位则跳转 0标志=0 JNE JZ
JS 如果符号位被置位则跳转 符号标志=1   JNS
JNS 如果符号位没有被置位则跳转 符号标志=0   JS
JO 如果溢出标志置位则跳转 溢出标志=1   JNO
JNO 如果溢出标志没有置位则跳转 溢出标志=0 JO  
JP 如果奇偶校验位被置位则跳转 奇偶校验标志=1 JPE JNP
JPE 如果奇偶校验位为偶校验则跳转 奇偶校验标志=1 JP JPO
JNP 如果奇偶校验位没有被置位则跳转 奇偶校验标志=0 JPO JP
JPO 如果奇偶校验位为奇校验则跳转 奇偶校验标志=0 JNP JPE

 

 
表2·使用无符号数比较的JCC指令
指 令 描 述 条 件 别 名 相反指令
JA 如果超过(>)则跳转 进位标志=0,0标志=0 JNBE JNA
JNBE 如果不低于或等于(不 <=)则跳转 进位标志=0,0标志=0 JA JBE
JAE 如果超过或等于(>=)则跳转 进位标志=0 JNC,JNB JNAE
JNB 如果不低于则跳转(不 <) 进位标志=0 JNC,JAE JB
JB 如果低于(<)则跳转 进位标志=1 JC,JNAE JNB
JNAE 如果不超过或等于(不>=)则跳转 进位标志=1 JC,JB JAE
JBE 如果低于或等于(<=)则跳转 进位标志=1或0标志=1 JNA JNBE
JNA 如果不超过(不>)则跳转 进位标志=1或0标志=1 JBE JA
JE 如果相等(=)则跳转 0标志=1 JZ JNE
JNE 如果不相等(<>)则跳转 0标志=0 JNZ JE

 

 
表3·使用有符号数比较的JCC指令
指 令 描 述 条 件 别 名 相反指令
JG 如果大于(>)则跳转 符号标志=溢出标志或0标志=0 JNLE JNG
JNLE 如果小于或等于(<=)则跳转 符号标志=溢出标志或0标志=0 JG JLE
JGE 如果大于或等于(>=)则跳转 符号标志=溢出标志 JNL JGE
JNL 如果不小于(不<)则跳转 符号标志=溢出标志 JGE JL
JL 如果小于(<)则跳转 符号标志<>溢出标志 JNGE JNL
JNGE 如果大于或等于(>=)跳转 符号标志<>溢出标志 JL JGE
JLE 如果小于或等于(<=)跳转 符号标志<>溢出标志或0标志=1 JNG JNLE
JNG 如果不大于(不>)则跳转 符号标志<>溢出标志或0标志=1 JLE JG
JE 如果等于(=)则跳转 0标志=1 JZ JNE
JNE 如果不等于(<>)则跳转 0标志=0 JNZ JE

寄存器 指令 8086 Inter汇编 AT&T汇编

注:本文为本站或本站会员原创优质内容,版权属于原作者及清泛网所有,
欢迎转载,转载时须注明版权并添加来源链接,谢谢合作! (编辑:admin)
分享到: