数据寄存器
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 |