汇编常用寄存器及指令基础总结
清泛原创
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指令
表2·使用无符号数比较的JCC指令
表3·使用有符号数比较的JCC指令
数据寄存器
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 |
上一篇:BMP 和 DIB
下一篇:汇编语言超浓缩教程(汇编入门必备)
评论加载中,请稍后...