3.1基本数据类型
基本数据类型在内存中的字节顺序
3.1.1 字、双字的对齐
- 字、双字在内存中并不需要对齐至自然边界(字、双字的自然边界是偶数编号的地址)
- 然而,为改进程序的性能,数据结构(特别是堆栈)只要可能,应对齐在自然边界上
- 这样做的理由是:对于不对齐的存储访问,处理器要求做两次存储访问操作;而对于对齐的访问只要做一次存储访问操作
3.1.2 数字数据类型
(1)无符号整数
它们的值的范围,对于字节是从0 ~ 255;对于字,从0 ~ 65535;对于双字,从0 ~ -1
(2)符号整数
- 符号整数是保存在字节、字、双字中的带符号额二进制数
- 负数的符号位为1,正数的符号位为0
- 整数值范围,对于字节,从-128+127;对于字从-32768+32767;对于双字,从- ~ +-1
符号整数编码
3.1.3指针数据类型
3.1.4 串数据类型
串是位、字节、字或双字的连续序列
3.2 8086的指令格式
指令有以下格式:
label(标号):mnemonic(助记符)
argument1(参数1),argument2(参数2),argument3(参数3)
其中标号是一标记符后面跟有冒号(:)
助记符是一类具有相同功能的指令操作码的保留名
操作数参数1、参数2和参数3是任选的
3.3 8086指令的操作数寻址方式
8086机器指令有零个或多个操作数。某些操作数是显式规定的,有的是指令中隐含的
一个操作数能定位在以下之一中:
- 指令自身中(立即数)
- 寄存器
- 存储单元
- I/O端口
3.3.1 立即数
立即寻址方式
3.3.2 寄存器操作数
源和目的操作数能在以下寄存器中,取决于正在执行的指令:
- 16位通用寄存器(AX、BX、CX、DX、SI、DI、SP或BP)
- 8位通用寄存器(AH、BH、CH、DH、AL、BL、CL或DL)
- 段寄存器(CS、DS、SS、ES、FS和GS)
- FLAGS寄存器
寄存器寻址
3.3.3 存储器操作数
1.规定段选择子
段寄存器的约定
MOV ES:[BX],AX
以下默认段选择,不能被超越
- 必须从代码段取指令
- 在串操作中的目的串必须存储在由ES寄存器指向的数据段
- 推入和弹出操作必须总是引用SS段
2.规定偏移量
内存地址的偏移量部分或者直接作为一个静态值(称为位移量)规定或者由以下或多个成员通过计算得到地址:
- 位移量——一个8位或16位值
- 基地址——在通用寄存器中的值
- 索引——在通用寄存器中的值
作为基地址或索引的通用的通用寄存器限制如下:
- SP寄存器不能用作索引寄存器
- 当SP或BP寄存器用作为基地址,SS段是默认的段
(1)位移量
直接寻址方式示意图
(2)基地址
基地址寄存器间接寻址示意图
(3)基地址+位移量
基地址加位移量寻址方式
(4)索引(变址)+位移量
- 当数组的元素2、4或8字节时这种地址方式为索引进入静态数组提供了有效的方法
(5)基地址+索引+位移量
基地址、变地址加位移量
3.汇编程序和编译程序寻址方式
在机器码级,所选择地位移量、基寄存器、索引寄存器和比例系数是在指令中编码地
汇编程序允许程序员用这些寻址成员地任何允许地组合以寻址操作数
高级语言编译程序根据程序员定义地语言结构选择这些成员地适当组合
3.3.4 I/O端口寻址
x86处理器支持至包含65536个8位I/O端口地址和I/O地址空间
1.MOV指令
MOV DOPD(目的操作数),SOPD(源操作数)
MOV指令使用举例
2.交换指令
XCHG DOPD,SOPD
- 使两个操作数交换
3.堆栈操作指令
调用子程序示意图
(1)入栈指令
PUSH DOPA
- 在入栈操作时,把一个字(或双字)从源操作数传送至有SP(ESP)所指向的堆栈的顶部
PUSH AX
PUSH BX
堆栈操作示意图
PUSH r W SP = SP - 1, (SP) = 2
PUSH seg W SP = SP -2,(SP) = seg
PUSH src W SP = SP -2,(SP) = src
(2)出栈指令
POP POPD
- 把现行SP所指向的堆栈顶部的一个字或双字,送至指定的目的操作数,同时修改堆栈指针的操作,即SP+2 -> SP
POP r W r = (SP),SP = SP + 2
POP seg W seg = (SP).SP = SP+2
POP dst W dst = (SP),SP = SP+2
(3)PUSHA推入通用寄存器至堆栈
- PUSHA(push all)将所有地16位(即8086)地通用寄存器推至堆栈
Temp <- (SP)
Push (AX)
Push (CX)
Push (DX)
Push (BX)
Push (Temp)
Push (BP)
Push (SI)
Push (DI)
(4)POPA自堆栈弹出至通用寄存器
- POPA(Pop All)自堆栈弹出至16位通用寄存器
DI <- Pop();
SI <- Pop();
BP <- Pop();
ESP增量2(跳过堆栈地下2个字节)
BX<- Pop();
DX <- Pop();
CX <- Pop();
AX <- Pop();
4.输入输出指令
(1)IN
- 允许把一个字节或一个字由一个输入端口(port),传送至AL(若是一个字节)或是AX(若是一个字)
IN AL,n B AL=[n]
IN AX,n W AX=[n+1][N]
IN AL,DX B AL=[DX]
IN AX,DX W AX=[DX+1][DX]
(2)OUT
- 允许把在AL中的一个字节或AX中一个字,传送至一个输出端口
OUT n,AL B AL->[n]
OUT N,AX W AX->[n],[n+1]
OUT DX,AL B AL->[DX]
OUT DX,AX W AX-> [DX][DX+1]
5.扩展指令
(1)CWD
- 能把AX中字的符号扩展至DX中(形成32位操作数)
(2)CBW - 把寄存器AL中的字节的符号送至AH中(形成16位操作数)
3.4.2 二进制算术指令
1.加法指令
(1)ADD指令
ADD DOPD,SOPD
- 完成两个操作数的相加
ADD r,src B/W/D r <- r+src
ADD a,im B/W/D A <- a+im
注:im指立即数
ADD dst,im B/W/D dst <- im+dst
ADD dst,r B/W/D dst <- r+dst
(2)ADC(Add with Carry)指令
ADC DOPD,SOPD
- 两个操作数相加时,要把进位标志C的现行值加上去,结果送至一个目标操作数(DOPD)
ADC r,src r <- r+src+c
ADC a,im B/W/D a <- a+im+c
注:im指立即数
ADC dst,im B/W/D dst <- im+dst+c
ADC dst,r B/W/D dst <- r+dst+c
- 两个数分别放在自FIRST和SECOND开始的存储区中
MOV AX,FIRST
ADD AX,SECOND
MOV THIRD,AX
MOV AX,FIRST+2
ADC AX,SECOND+2
MOV THIRD+2,AX
2.减法指令
(1)SUB指令
SUB DOPD,SOPD
-
从DOPD中减去POPD
(2)SBB(Subtract with Borrow)指令
SBB DOPD,SOPD
-
两个操作数相减时,还要减去借位标志CF的现行值
3.乘法指令
(1)MUL无符号数乘法指令
MUL SOPD
-
完成在AL(字节)或AX(字)的操作数和另一个操作数(两个无符号数)的乘法
把内存单元FIRST和SECOND这两个字节的内容相乘
(2)IMUL符号数乘法指令
-
若结果的高半部分(对于字节相乘则为AH,对于字相乘则为DX)不是低半部分符号位扩展则标志CF=1,OF=1;否则CF=0,OF=0
4.除法指令
(1)DIV
-
无符号除法指令,能把在AX和它的扩展部分(若是字节相除则在AH和AL中,若是字相除则在DX:AX中)中的的无符号被除数被源操作数除,且把相除以后的商送至累加器(8位时送至AL。16位时送至AX),余数送至累加器的扩展部分(8位时送至AH,16位时送至DX),若除数为0,则会在内部产生一个类型0中断
(2)IDIV
- 在字节相除时,最大的商为+127(7FH),而最小的负数商为-127(81H);在字相除时,最大的商为+32767(7FFFH),最小的负数商为-32767(8001H)
5.增量减量指令
(1)INC增量
-
对指定操作数加1,然后返回此操作数
(2)DEC减量
- 对指定操作数减1,然后把结果送回操作数
6.NEG取补指令
- 这条指令是对操作数取补,即用零减去操作数,再把结果送回操作数
- 若在字节操作时对-128,或在字操作时对-32768取补,则操作没变化,但溢出标志位OF置位
7.CMP指令
- 完成两个操作相减,使结果反映在标志位上,但两操作数不变
CMP AX,BX
若要求比较AX和BX中两个正数的大小,把大数放在AX中就可以用一下程序段:
要把AX和BX中的大的值放在AX中的程序段,可改为:
四种情况
(1)若参与比较的两数为A和B,A与B都为正数,则执行CMP指令后,若SF=0,则A>B;反之A (2)若A>0,B<0.
A=+127,B=-63,比较时执行A-B=A+(-B)=+127+(-(-63))=+127+63,则在机器中的结果
(3)若A<0,B>0
例如:A=-63,B=+127,则显然A ,且运算结果应为负。
但A-B=A+(-B),在机器中的运行结果为:
(4)若A<0,B<0
在没有溢出的情况下,即OF=0时:SF=0,则A>B;SF=1,则A 在发生溢出的情况下,即OF=1时:SF=1,A>B;SF=0,A
所以当两个带符号数相比较时,要把标志位SF和OF结合起来一起考虑,才能判断哪个数大。
3.4.3十进制算术命令
1.在加法后进行十进制调整(Decimal Adjust for Addition,DAA)
- 对在AL中的的由两个组合的十进制数相加的结果进行校正,以得到正确的组合的十进制和
若(AL&0FH)> 9或标志AF=1,则AL <- AL + 6
AF <- 1
若AL>9FH或标志CF=1,则AL <- AL + 60H
CF <- 1
此指令影响标志AF、CF、PF、SF、ZF,而对标志位OF未作定义
2.在减法后进行十进制调整(Decimal Adjust for Subtraction,DAS)
- 能对在AL中两个组合的十进制数相减以后的结果进行校正以得到正确组合的十进制差
校正的操作为:
若(AL&0FH)> 9或标志AF=1,则AL <- AL - 6
AF <- 1
若AL>9FH或标志CF=1,则AL <- AL - 60H
CF <- 1
指令执行的结果,影响标志AF、CF、PF、SF和ZF,但对标志位OF未定义
3.在加法后进行ASCII调整(Unpacked BCD[ASCII] Adjust for Addition,AAA)
-
这条指令对在AL中的由两个未组合的十进制操作数相加后的结果进行校正,产生一个未组合的十进制和
校正的操作为:
若(AL&0FH)> 9或标志AF=1,则
AL <- AL + 6
AH <- AH + 1
AF <- 1
CF <- 1
AL <- AL&0FH 这条指令对标志位AF和CF有影响,而对OF、PF、SF、ZF等标志位未定义
4.在减法后进行ASCII调整(Unpacked BCD[ASCII] Adjust for subtraction,AAS)
校正的操作为:
若(AL&0FH) > 9或标志AF=1,则
AL <- AL -6
AH <- AH - 1
AF <- 1
CF <- 17
AL <- AL & 0FH
5.在乘法后进行ASCII调整(Unpacked BCD[ASCII]Adjust for Multiply,AAM)
- 这条指令能把在AX中的两个未组合的十进制数相乘的结果进行校正,最后在AX中能得到正确的未组合的十进制数的乘积(即高位在AX中,低位在AL中)
校正的操作为:
AH <- AL/0AH (AL被0A除的商 -> AH)
AL <- AL%0AH(AL被0A除的余数->AL)
6.在除法前进行调整(Unpacked BCD[ASCII]Adjust for Division)
- 这条指令能把在AX中的两个未组合的十进制数相除以前进行校正,这样在两个未组合的十进制数相除以后,可以得到香泽的未组合的十进制结果
校正的操作为:
AL <- AH * 0AH + AL
AH <- 0
3.4.4逻辑指令
1.AND执行按位逻辑与
(1)AND指令
AND DOPD,SOPD
-
这条指令对两个操作数进行按位与运算,即只有相“与”的两位全为1,与的结果才为1;否则结果为0.“与”以后的结果送到目的操作数
(2)TEST
若要检测AL中的最低位是否为1,若为1则转移,可用以下指令:
TEST AL 01H
JNZ THERE
THERE:...若要检测AL中的最高位是否为1,若为1则转移,可用以下指令:
TEST AL 8000H
JNZ TBERE
TBERE:...
若要检测CX中的最低位是否为0,若为0则转移,可用以下指令:
TEST CX 0FFFFH
JZ THERE
THERE:...
2. OR执行按位逻辑或
OR DOPD,SOPD
- 此条指令对指定的两个操作数进行逻辑“或”运算。即进行或运算的两位中任意一个为1(或两个都为1),则或的结果为1;否则为0.或运算的结果返回目的操作数
例如:
3.XOR执行按位逻辑异或
XOR DOPD,SOPD
- 这条指令对两个指定的操作数进行异或运算,当进行异或运算的两位不相同时(即一个为1,另一个为0),“异或”的结果为0.异或运算的结果返回目的操作数
例如
4.NOT执行按位逻辑非
NOT OPRD; B/W/D
OPRD的反码 -> OPRD
- 这条指令对源操作数求反,然后送回源操作数
3.4.5移位和循环移位指令
1.移位指令
SAL(算术左移) DOPD,OPD2
SHL(逻辑左移) DOPD,OPD2
SAR(算术右移) DOPD,OPD2
SHR(逻辑右移) DOPD,OPD2
第一个操作数时目标操作数,即对它进行移位操作。目标操作数可以时任一通用寄存器或内存操作数(可用于所有寻址方式)。第二个操作数规定移动的次数(或移位的位数)。
-
SAL/SHL在物理上是完全一样的,每移动一次后,最低位补0,最高位移入标志位CF
-
SAR每执行一次,使目标操作数右移移位,但保持符号位不变,最低位移至标志位CF
-
SHR指令每执行一次,使目标操作数右移移位,最低位进入标志位CF,最高位补0
2.循环移位指令
- 8086有四条循环移位指令ROL(Rotate Left)、ROR(Rotate Right)、RCL(Rotate through CF Left)和RCR(Rotate through Right)
- 前两条循环移位指令,未把标志位CF包含在循环的环中。后两条把标志位CF包含在循环的环中,作为整个循环的一部分
ROL DOPD,OPD2
-
第一个操作数是要对其进行移位操作的目标操作数。第二个操作数是8位立即数或寄存器CL,用以规定移位的次数
3.4.6控制传送指令
1.无条件转移指令JMP
转移程序控制至指令流的不同点而不保留返回信息
JMP DOPDDOPD能是rel8短转移、相对转移,偏移量相对于下一条指令
DOPD能是rel16近(NEAR)转移、相对转移,偏移量相对于吓一条指令
DOPD能是rel32近(NEAR)转移、相对转移,偏移量相对于下一条指令
DOPD能是r/m16近(NEAR)转移、绝对简介没地址在r/m16中给出
DOPD能是r/m32近(NEAR)转移、绝对简介,地址在r/m32中给定
DOPD能是ptr16:16远(FAR)转移、绝对转移,地址在操作数中规定
DOPD能是m16:16远(FAR)转移、绝对简介,地址在m16:16中给定
此指令能够用于执行以下不同类型的转移:
- 近转移——转移至当前码段(由CS寄存器当前指向的段),有时也称为段内转移
- 短转移——一种Near转移,其转移范围限制在当前EIP的-128 ~ +127之内
- 远转移——转移至与当前码段不同段内的指令,有时也称为段间转移
2.条件转移指令Jcc
Jcc Label
Label是转移的目标地址。即满足指令中规定的条件,则转移至目标地址;否则继续执行下一条指令
(1)根据单个标志位的条件转移
(2)组合条件的条件转移8086中的条件转移指令可分为以下两大类我
(1)根据单个标志位所形成的条件的条件转移指令
(2)根据若干个标志位的逻辑运算所形成的条件转移指令
(1)根据单个标志位所形成的条件的条件转移指令
①CF标志
a.JB(低于转移)/JNAE(不高于或等于转移)/JC(有进位、借位转移)
- 这是当进位标志CF=1时,能转移至目标地址的条件转移指令的三种助记符
b.JAE(高于或等于转移)/JNB(不低于转移)/JNC(无进位、借位转移) - 这是当进位标志CF=0时,能转移至目标地址的条件转移指令的三种助记符
②ZF标志
a.JE(相等转移)/JZ(等于零转移)
- 当ZF=1时,能转移至目标地址的条件转移指令的两种助记符
b.JNE(不相等转移)/JNZ(不等于零转移)
- 当ZF=0时,能转移至目标地址的条件转移指令的两种助记符
③SF标志
a.JS(符号转移,在此指的是符号为负转移)
- 这是符号位SF=1时,能转移到目标地址的条件转移指令
b.JNS(正转移) - 这是符号位SF=0时,能转移到目标地址的条件转移指令
④PF标志
a.JP(偶转移)/JPE(偶转移)
- 当奇偶标志PF=1,能转移到目标地址的条件转移指令两种助记符
b.JNP(奇转移)/JPO(奇转移) - 当奇偶标志PF=0,能转移到目标地址的条件转移指令两种助记符
⑤O标志
a.JO(溢出转移)
- 当溢出标志位OF=1时,能转移到目标地址的条件转移指令的助记符
b.JNO(未溢出转移) - 当溢出标志位OF=0时,能转移到目标地址的条件转移指令的助记符
(2)根据若干个标志位的逻辑运算所形成的条件转移指令
①判断无符号数的大小
a.JA(高于转移)/JNBE(不低于或等于转移)
- 即两个无符号数A和B相比较,当A>B(不包括相等的情况)时就满足这个条件
b.JBE(低于或等于转移)/JNA(不高于转移) - 即两个无符号数A和B相比较,当A
②判断带符号数的大小
a.JG(大于转移)/JNLE(不小于或等于转移)
- 即两个符号数A和B相比较,当A>B(不包括相等的情况)时就满足这个条件。不相等,则必然ZF=0;带符号数大于,则必须SF⊕OF=0(两者都为0或者两者都为1)所以反映这个标志为(SF⊕OF=0)∩ZF=0.
b.JGE(大于或等于转移)/JNA(不小于转移)
- 即两个符号数A和B相比较,当A>B(包括相等的情况)时就满足这个条件。带符号数大于,则必须SF⊕OF=0(两者都为0或者两者都为1)所以反映这个标志为(SF⊕OF=0)∩ZF=0.
c.JL(小于转移)/JNGE(不大于或等于转移)
- 即两个符号数A和B相比较,当A
d.JLE(小于或等于转移)/JNG(不大于转移)
当两个带符号数相比较,当A
JE/JZ若相等/若为0转移
JNE/JNZ若不相等/若不为0转移
JA/JNBE若高于/若不低于或等于转移
JAE/JNB若高于或等于/若不低于转移
JB/JNAE若低于/若不高于或等于转移
JBE/JNA若低于或等于/若不高于转移
JG/JNLE若大于/若不小于或等于转移
JGE/JNL若大于或等于/若不小于转移
JL/JNGE若小于/若不大于或等于转移
JLE/JNG若小于或等于。若不大于转移
JC若进位转移
JNC若无进位转移
JO若溢出转移
JNO若无溢出转移
JS若符号位位1(负)转移
JNS若符号位为0(正)转移
JPO/JNP若奇/若奇偶标志位为0转移
JPE/JP/若奇偶标志位为1转移
JCXZ/JECXZ寄存器CX为0/寄存器ECX为0转移
3.重复控制指令
8086处理器有三种控制的指令:
(1)LOOP
LOOP指令使CX(ECX)减1,且判断若CX(ECX不等于0),则循环至目标操作数——IP+偏移量(符号扩展至16位)
一条LOOP指令相当于以下两种指令的组合:
DEC CX
JNZ AGAIN
(2)LOOPZ/LQOPE
- 此指令使CX减1,且判断只有在CX不等于0,而且标志ZF=1的条件下,才循环至目标操作数——IP+偏移量
(3)LOOPNZ/LOOPNE
- 此指令使CX减1,且判断只有在CX不等于0,而且标志ZF=0的条件下,才循环至目标操作数——IP+偏移量
4.调用与返回指令
(1)CALL调用过程
CALL指令能执行官不同类型的调用:
NEAR调用——调用在当前代码段(由CS寄存器指向的当前段)内的过程,也称为段内调用
FAR调用——调用位于与当前代码段不同段的过程,也称为段间调用
(2)RET返回有两种返回指令:
RET
RET OPD
RET指令能用于执行不同类型的返回:
- NEAR返回——返回至当前代码段(由CS寄存器当前指向的段)内的调用过程,也称为段内返FAR返回——返回至与当前代码段不在同一段内的调用过程,也称为段间返回
(3)IRET从中断返回
(4)INT软件中断、INTO在溢出时中断
5.过程指令
(1)BOUND检测值是否超过范围
BOUND OPD1,OPD2
- 确定第一个操作数(数组索引)是否由第二个操作数(边界操作数)规定的数组边界内
(2)ENTER高级进入过程
ENTER OPD1,OPD2 - 为过程建立堆栈帧。第一个操作数(尺寸操作数)规定堆栈帧的尺寸(即过程分配到堆栈上的动态存储的字节数)。第二个操作数(嵌套层操作数)给定过程的此法嵌套层(0~8)。
嵌套层确定从前面帧拷贝至新堆栈帧的“显示区”的堆栈帧指针的数量。这两个个操作数都是立即数
(3)LEAVE高级过程退出
- LEAVE指针拷贝帧指针(在EBP寄存器洪)到堆栈指针寄存器(ESP),它释放分配给堆栈帧的空间
3.4.7串指令
串指令对字节串操作,允许它们移至存储器或从存储器传送。
8086处理器有七种基本的串操作指令
(1)MOVS(Move String)
前面传送100个操作数的例子,可以改为:
可简化为:
(2)CMPS
CMPS/CMPSB比较串/比较字节串
CMPS/CMPSW比较串/比较字串
利用CMPS指令对STRING1和STRING2两个字符串进行比较的程序:
(3)SCAS
SCAS/SCASB扫描串/扫描字节串
SCAS/SCASW扫描串/扫描字串
- 搜索串指令,关键字放在AL(字节)或AX(字)中,操作时从AL(字节操作)或AX(字操作)的内容中减去由DI作为指针的目的串元素,结果反映在标志位上,但不改变目的串元素以及累加器的值
例子:把要搜索的关键字放在AL(字节)或AX
(字)中,用以搜索内存的某一数据块或字符串中,有无此关键字。若有,把搜索次数记下(若次数为0,表示无要搜索的关键字),且记录下存放关键字的地址
(4)LODS
LODS/LODSB装入串/装入字节串
LODS/LODSW装入串/装入字串
- 本指令把由SI作为指针的串元素,传送至AL(字节操作)或AX(字操作),同时修改SI,使其指向串中的下一个元素。
(5)STOS
STOS/STOSB 存储串/存储字节串
STOS/STOSW 存储串/存储字串
例:若在内存缓存区中有一个数据块,起始地址为BLOCK。数据块中的数据有正有负,要求把其中的正负数分开,分别送至同一段的两个缓冲区,存放整数的缓冲区的其实地址为PLUS_DATA;存放负数的缓冲区的起始地址为MINUS_DATA
(6)串输入指令INS/INSB/SINSW/INSD——从端口输入至串
INS M8.DX
INS M16,DX
INSB
INSW
- 此类指令从源操作数(第二个操作数)拷贝至由目标操作数(第一个操作数)。源操作数是一I/O端口地址(从0 ~ 65535)由DX寄存器规定。目标操作数是以内存单元,其地址由ES:DI寄存器规定。
(7)串输出指令OUTSB/OUTSW——拷贝至端口
OUTS DX,m8
OUTS DX,m16
OUTSB
OUTSW
- 此类指令从源操作数(第二个操作数)拷贝至由目标操作数(第一个操作数)规定的I/O端口。源操作数是以内存单元,其地址由DS:DI寄存器规定。目标操作数是一I/O端口地址(从0 ~ 65535),由DX寄存器规定
3.4.8标志控制操作
标志控制指令对EFLAGS寄存器中的标志进行操作
- STC设进位标志
- CLC清楚进位标志
- CMC对进位标志取反
- CLD清楚方向标志
- STD设置方向标志
- LAHF加载标志至AH寄存器
- SAHF存AH寄存器至标志
- PUSHF推入FLAGS至堆栈
- POPF从堆栈弹出至FLAGS
- STI设中断标志
- CLI清楚中断标志
3.4.9段寄存器指令
格式位:
LDS r16,mem16:16
LDS r32,mem16:32
LES r16,mem16:16
LES r32,mem16:32
LSS r16,mem16:16
LSS r32,mem16:31
- 从源操作数(第二个操作数)架子以FAR指针,段选择子和偏移量至指定的段寄存器和第一个操作数(目标操作数)。指令操作码和目标操作码规定段寄存器/通用寄存器对.16位段选择子从源操作数加载至用操作码规定的段寄存器(DS、ES、SS、FS或GS)。16位偏移量加载至目标操作数规定的寄存器
3.4.10杂项指令
(1)LEA加载有效地址
LEA r16,m
- 计算操作数的有效地址(即段内偏移地址)并存储至目标操作数
(2)NOP空操作
(3)XLAT/XLATB表格查找传送
XLAT m8
XLATB - 用AL寄存器作为表的索引,定位在内存中的字节项。然后把它送至AL。在AL寄存器中的索引作为无符号数对待。此指令从DS:BX寄存器得到内存中表的基地址(DS段可以用段超越前缀来超越)
https://wenku.baidu.com/view/6ef5630ff12d2af90242e608