汇编复习要点一
能识别各种寻址方式,尤其是存储器寻址
与数据有关的寻址方式
- 立即寻址方式
- 寄存器寻址方式
- 直接寻址方式
- 寄存器间接寻址方式
- 寄存器相对寻址方式
- 基址变址寻址方式
- 相对基址变址寻址方式
与转移地址有关的寻址方式
- 段内直接寻址
- 段内间接寻址
- 段间直接寻址
- 段间间接寻址
理解立即寻址方式
操作数直接存放在指令中,紧跟在操作码之后,它作为指令的一部分存放在代码段里,这种操作数称为立即数。 【例】 MOV AL,5;执行后,(AL)=5 【例】 MOV AX,3064H;执行后,(AX)=3064H
寄存器寻址和寄存器间接寻址的区别
寄存器寻址方式
操作数在寄存器中,指令指定寄存器号。 【例】MOV AX,BX 如指令执行前 (AX)=3064H,(BX)=1234H;则指令执行后,(AX)=1234H。
寄存器间接寻址方式
有效地址就在某个寄存器中,而操作数则在存储器中。在16位寻址时可用的寄存器是BX,BP,SI和DI。
8086存储器寻址的有效地址如何构成
有效地址可以由几部分组成:基址寄存器内容、变址寄存器内容、比例因子和位移量。
有效地址可以由以下四种成分组成: (1)位移量(displacement)是存放在指令中的一个8位、16位或32位的数,它不是立即数,是一个地址。 (2)基址(base)是存放在基址寄存器中的内容。 它是有效地址中的基址部分,通常用来指向数据段中数组或字符串的首地址。 (3)变址(index)是存放在变址寄存器中的内容。它通常用来访问数组中的某个元素或字符串中的某个字符。 (4)比例因子(scale factor)是386及其后继机型新增加的寻址方式中的一个术语,其值可为1、2、4或8。在寻址中,可用变址寄存器的内容乘以比例因子来取得变址值。这类寻址方式对访问元素长度为2,4,8 字节的数组特别有用。
有效地址的计算可以下式表示: EA=基址+(变址×比例因子)+位移量
段前缀使用的3个例外情况
(1) 串处理指令的目的串必须用ES段; (2) PUSH指令的目的和POP的源必须用SS段; (3) 指令必须存放在CS段中。
默认段选择规则
访存类型 | 所用段及段寄存器 | 缺省选择规则 |
---|---|---|
指令 | 代码段CS | 用于取指 |
堆栈 | 堆栈段SS | 所有的堆栈的进栈和出栈任、何用BP作为基址寄存器的访存 |
局部数据 | 数据段DS | 除相对于堆栈以及串处理指令的目的串以外的所有数据访问 |
目的串 | 附加数据段ES | 串处理指令的目的串 |
双操作数指令的2个操作数可以都是存储器寻址吗
不可以,为使指令字不要过长,规定双操作数指令的两个操作数中,只能有一个使用存储器寻址方式。
立即寻址和直接寻址都用到数值,汇编指令中如何区分
中括号
了解符号地址的使用方式
寄存器间接寻址使用的寄存器可以是AX吗
EA=[DI]/[SI]/[BX]/[BP];
掌握有效地址有2种以上成分时的各种表示方法
学会使用与转移地址有关的寻址方式
段内直接寻址方式有哪2种?段间直接寻址呢?
格式:JMP SHORT OPR 执行的操作:(IP)←(IP)+8位位移量 格式:JMP NEAR PTR OPR 执行的操作:(IP) ← (IP)+16位位移量 8位和16位位移量由目标地址OPR确定,可使用符号地址
与地址相关的间接寻址如果使用存储器寻址,为什么要指出是字还是双字?
因为涉及段间和段内,段内,双字就是段间
MOV指令应注意的细节
- CS和IP不能作为操作数,sreg不包括CS
- 立即数不能做目的操作数
- 立即数不能直接赋值给段寄存器sreg,需要时可以通过通用寄存器中转
- 两个存储器单元之间不能直接传送数据,即不能同时做源操作数和目的操作数
- 两个段寄存器之间不能直接传送数据
- 目的操作数和源操作数的数据宽度必须一致,即都必须为8位或都必须为16位
理解指令PUSH和POP,注意其格式及使用方法
格式为:PUSH SRC 执行操作(8086为16位指令): (SP)←(SP)-2 ((SP)+1,(SP))←(SRC) PUSH向SS:SP存数 PUSH CX;若(SP)=2000H,执行指令后,CH与CL的内容分别压入堆栈偏移量为1FFFH与1FFEH的字节单元中,而(SP)=1FFEH
格式为:POP DST 执行操作(8086为16位指令): (DST)←((SP)+1,(SP)) (SP)←(SP)+2 8086中,PUSH和POP指令只能作字操作,均不影响标志位 POP从SS:SP取数 POP DS;若(SP)=2000H,执行指令后,堆栈中偏移量为2000H与2001H的两字节单元分别送DS低字节和高字节单元中,而(SP)=2002H
8086中,PUSH/POP指令允许的格式: PUSH/POP reg PUSH/POP mem PUSH/POP segreg segreg不允许使用 CS 寄存器,操作数不允许使用立即数寻址方式(PUSH data) 保存现场时要注意压入与弹出的顺序是相反的,例如: 压入时:push AX push BX 弹出时:pop BX pop AX
XCHG指令的2个操作数中必须有一个是寄存器,对不对?
对
学会IN和OUT指令的2种使用形式
IN 输入指令 长格式为:IN AL,PORT(字节) IN AX,PORT(字) 执行的操作:(AL)←(PORT)(字节) (AX)←(PORT+1,PORT)(字)
短格式为:IN AL,DX(字节) IN AX,DX(字) 执行的操作:(AL)←((DX))(字节) (AX)←((DX)+1,(DX))(字) PORT为8位地址,DX可指定16位地址 以上针对8086
OUT 输出指令 长格式为:OUT PORT,AL(字节) OUT PORT,AX(字) 执行的操作:(PORT)←(AL)(字节) (PORT+1,PORT)←(AX)(字)
短格式为:OUT DX,AL(字节) OUT DX,AX(字) 执行的操作:((DX))←(AL)(字节) ((DX+1,(DX))←(AX)(字) 以上针对8086
I/O端口取值范围是多少?
0~65535
了解XLAT指令的功能
格式为:XLAT OPR XLAT 执行的操作(8086为16位指令): (AL) ← ((BX)+(AL)) 将BX中内容与AL中内容相加,作为偏移地址,将数据段中对应字节单元内容送入AL中。BX通常为表格首址,利用该指令实现查表。由于AL只有8位,所以表格长度不能超过256 OPR为表格首地址(一般为符号地址),只为可读性而设置,不真正发挥作用 指令不影响标志位 例: MOV AL,5 MOV BX, OFFSET TAB XLAT … TAB DB 10H 23H 34H 12H 23H 45H 65H 90H 76H 执行指令后,(AL)=45H 例:如(BX)=0040H,(AL)=0FH,(DS)=F000H 指令XLAT把F0000H+0040H+0FH=F004F的内容送AL 最后(AL)=2CH
LEA BX,LIST与 MOV BX,OFFSET LIST完成的功能一样吗
一样
LDS(LES)指令的功能
段寄存器装入指令 LDS/LES 格式:LDS/LES REG,SRC LDS与LES指定的段寄存器分别为DS和ES SRC只能用存储器寻址方式 目的寄存器不允许使用段寄存器。 执行的操作:(REG)←(SRC) (SREG)←(SRC+2) 例:LDS BX,[2000H] ;把内存数据段中偏移量为2000H开始的[2000H]、[2001H]单元内容送BX,[2002H]、[2003H]单元内容送DS
存取标志寄存器的方法有哪些
存取标志寄存器指令 LAHF 标志送AH指令 格式为:LAHF 执行的操作:(AH)←(FLAGS的低字节) SAHF AH送标志寄存器指令 格式为:SAHF 执行的操作:(FLAGS的低字节)←(AH)
8到16位和16到32的符号扩展使用哪2个命令,如何扩展?
CBW字节转换为字指令 格式:CBW 执行的操作:AL的内容符号扩展到AH,形成AX中的字。 若(AL)<80H,则(AH)=0;若(AL)>=80H,则(AH)=0FFH CWD字转换为双字指令 格式:CWD 执行的操作:AX的内容符号扩展到DX,形成DX:AX中的双字。 若(AX)<8000H,则(DX)=0;若 (AX)>=8000H,则(DX)=0FFFFH CBW/CWD常被安排在IDIV指令之前
INC和DEC指令是否影响CF位?
不影响
把数a变成-a。用哪个指令完成最简单?
NEG求补指令
加减法指令分哪2种?乘除法指令分哪2种?
ADD加法指令 ADC带进位加法指令 SUB减法指令 SBB带借位减法指令 MUL无符号数乘法指令 IMUL带符号数乘法指令 DIV无符号数除法指令 IDIV带符号数除法指令
理解加减法后CF、OF、ZF、SF如何变化
ADD为不带进位加法指令,将源操作数和目的操作数相加,和保留在目的操作数之中,并改变标志位:CF(通过加法运算是否有进位判断)、OF、SF、PF、ZF和AF ADC AL,30H[BX];AL中内容加上数据段中[BX+30H]字节内容,再加上CF位原值,结果送AL。如果再有进位,则置位CF,否则CF位清0, 结果还影响标志位:OF、SF、PF、ZF和AF SUB为不带借位减法指令 若减数>被减数,CF=1,否则CF=0 也可以用二进制补码运算(加法形式)是否有最高位进位判断,有则CF=0,否则CF=1 减1指令DEC将操作数内容减1,都把结果送回操作数中,并根据结果设置除CF以外的标志位,操作数不能为立即数,经常用于修改地址指针 MUL DL;指令完成DL与AL内容的字节乘法运算 MUL WORD PTR [2000H];指的是[2000H][2001H]单元字内容与AX内容进行字乘法运算 对于MUL指令,如果乘积的高一半为0,则CF位和OF位均为0;否则CF位和OF位均为1。 对于IMUL指令,如果乘积的高一半是低一半的符号扩展,则CF位和OF位均为 0,否则就均为1。 DIV执行的操作: 字节操作:(AL)←(AX)/(SRC)的商 (AH)←(AX)/(SRC)的余数 字操作:(AX)←(DX,AX)/(SRC)的商 (DX)←(DX,AX)/(SRC)的余数 IDIV操作方法与DIV相同,但操作数为带符号数。 除法指令对所有条件码位均无定义。 IDIV字节相除时,商的范围是-080H-7FH,字相除时,商的范围是-8000H-7FFFH。如果除数为“0”或商超出累加器的容量,则产生除法错误故障(中断0) 余数的符号和被除数相同 除法运算和CBW,CWD配合使用
理解CMP指令如何完成数的比较
格式:CMPS SRC,DST CMPSB(字节) CMPSW(字) 执行的操作: ① ((DS): (SI)) - ((ES): (DI)) ②字节操作: (SI)←(SI)±1 (DI)←(DI)±1 字操作:(SI)←(SI)±2(DI)←(DI)±2 DF=0用+,否则用−
能够编程完成2个双精度数(32位)加减运算
了解8086中乘除法操作数寄存器及大小约定
格式:MUL SRC(reg/mem) 执行的操作: 字节操作数:(AX)←(AL)*(SRC) 字操作数:(DX , AX)←(AX)*(SRC)
格式:DIV SRC(reg/mem) 执行的操作: 字节操作:(AL)←(AX)/(SRC)的商 (AH)←(AX)/(SRC)的余数 字操作: (AX)←(DX,AX)/(SRC)的商 (DX)←(DX,AX)/(SRC)的余数
理解cbw和cwd如何配合idiv使用
计算(V-(X*Y+Z-540))/X,其中变量均为16位带符号数,结果商存入AX,余数存入DX
mov ax,x ;ax装入x
imul y ;x*y,结果低16位放在ax
mov cx,ax;结果低16位放入cx中
mov bx,dx;结果高16位放在bx中
mov ax,z;ax中装入z
cwd ;ax扩展为dx-ax
add cx,ax;x*y+z,结果低16位放cx中
adc bx,dx;结果高16位放bx中
sub cx,540 ; x*y+z-540,结果低16位放cx中
sbb bx,0;结果高16位放bx中
mov ax,v;ax中装入v
cwd ;ax扩展为dx-ax
sub ax,cx ; v-(x*y+z-540),结果低16位放ax中
sbb dx,bx;结果高16位放dx中
idiv x;(v-(x*y+z-540))/x,商为ax,余数为dx
理解什么是压缩BCD码和非压缩BCD码。能够完成BCD码的转换
压缩的BCD码(packed BCD format)用4位二进制数表示一个十进制数位,形成为一个顺序的以4位为一组的数串 非压缩的BCD码 (unpacked BCD format)则以8位为一组表示一个十进制数位,8位中的低4位是以8421码表示的十进制数位,而高4位则没有意义
学会使用各种逻辑运算指令,理解给出实例
格式:AND DST , SRC 执行的操作:(DST)←(DST)∧(SRC)
格式:OR DST , SRC 执行的操作:(DST)←(DST)∨(SRC)
格式:XOR DST , SRC 执行的操作:(DST)←(DST)⊕(SRC)
格式:TEST OPR1 , OPR2 执行的操作:(OPR1)∧(OPR2)
格式:NOT reg/mem 执行的操作:(OPR)← $\neg$ (OPR)
各种移位指令的含义
逻辑左移指令SHL和算术左移指令SAL 逻辑右移指令SHR和算术右移指令SAR 循环左移指令ROL和循环右移指令ROR 带CF位的循环左移指令RCL和循环右移指令RCR
移位指令移位次数大于1时,使用哪个寄存器?
CNT=1:SHL OPR, 1 CNT>1:MOV CL, CNT SHL OPR, CL
左移指令SHL和SAL的执行,右移呢?
两条指令物理操作完全相同,每移位一次在后面补“0”,而最高位进入标志位CF。左移一位,相当于原数乘以2
两条指令是将目的操作数向右移1~255位,移出的位进入CF之中 对干SHR右移后,最高位补0;而SAR右移后,最高位为符号位保持不变
学会利用逻辑指令做乘除法
MOV CL, 5
SAR WORD PTR [DI], CL
;若(DS)=0F800,(DI)=180AH,(0F980A)=0064H
;则(0F980A)=0003,CF=0,相当于100/32
MOV CL, 2
SHL SI, CL
;若(SI)=1450H,则(SI)=5140H,CF=0,相当于5200*4
;若(AX)=0012H,(BX)=0034,实现(AX)=1234H
MOV CL, 8
ROL AX, CL
OR AX, BX;或ADD AX,BX
掌握各种串操作指令,理解执行过程,能够指出相关寄存器的变化
与REP相配合的串传送指令MOVS、STOS、LODS
格式:REP MOVS/LODS/STOS 执行的操作: ①如(CX)=0,则退出REP,否则往下执行; ②(CX) ← (CX)-1; ③执行其后的串指令; ④重复① ~ ③。 需要注意的是CX的递减是不影响标志位的
MOVS DST,SRC MOVSB MOVSW MOVSB = MOVS ES:BYTE PTR [DI], DS:[SI] MOVSW = MOVS ES:WORD PTR [DI], DS:[SI] ① ((ES):(DI))←((DS):(SI)) ②字节操作: (SI)←(SI)±1 (DI)←(DI)±1 ③字操作: (SI)←(SI)±2 (DI)←(DI)±2 当方向标志位DF=0时用+,DF=1时用−
REP、REPZ、REPNZ有什么不同?都分别和那些串处理指令联用?理解其执行过程
与REPE/REPZ和REPNE/REPNZ联合工作的串比较指令CMPS和SCAS