IBMPC汇编语言期末总复习资料大全免费Word文件下载.docx
《IBMPC汇编语言期末总复习资料大全免费Word文件下载.docx》由会员分享,可在线阅读,更多相关《IBMPC汇编语言期末总复习资料大全免费Word文件下载.docx(25页珍藏版)》请在冰豆网上搜索。
![IBMPC汇编语言期末总复习资料大全免费Word文件下载.docx](https://file1.bdocx.com/fileroot1/2023-1/23/2375e824-21b2-44ff-968c-cbe0bac9573c/2375e824-21b2-44ff-968c-cbe0bac9573c1.gif)
CS(16位)代码段DS(16位)数据段
SS(16位)堆栈段ES(16位)附加段
4、段寄存器和相应存放偏移地址的寄存器之间的默认组合
段
偏移
CS
IP
SS
SP或BP
DS
BX、DI、SI或一个16位数
ES
DI(用于串指令)
第三章
1、七种寻址方式(举例)
立即寻MOVAX,3069H
寄存器寻MOVAL,BH
在内存中的五种寻址
直接寻MOVAX,[2000H]
寄存器间接寻MOVAX,[BX]
寄存器相对寻MOVAX,COUNT[SI]或者MOVAX,[SI+COUNT](不推荐)
基址变址寻址MOVAX,[BP][DI]
相对基址变址寻址MOVAX,MASK[BX][SI]
2、指令系统
I.数据传送指令
(1)通用数据传送指令
MOV传送
MOVSX带符号扩展传送
用源操作数的符号位来填充目的操作数的高位数据位。
例:
MOVSXEAX,CL
把CL寄存器中的8位数,符号扩展为32位数,送到EAX寄存器中。
MOVZX带零扩展传送
恒用0来填充目的操作数的高位数据位
MOVZXDX,AL
把AL寄存器中的8位数,零扩展成16位数,送到DX寄存器中。
PUSH进栈
入栈时高位字节先入栈,低位字节后入栈。
SP指向栈顶。
POP出栈
以“先进后出”方式工作。
SP指向栈顶
PUSHA/PUSHAD所有寄存器进栈
PUSHA(16位):
进栈次序为:
AX,CX,DX,BX,SP,BP,SI,DI
PUSHAD(32位):
EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI
POPA/POPAD所有寄存器出栈
POPA(16位):
出栈次序为:
DI,SI,BP,SP,BX,DX,CX,AX
POPAD(32位):
EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX
XCHG交换
XCHGAX,BX交换AX与BX中的数据
(2)累加器专用传送指令
(只限于使用累加器)
IN输入
INAX,28H
MOVDATA_WORD,AX
把端口28的内容经过AX传送到存储单元DATA_WORD中。
OUT输出
OUT5,AL
从AL寄存器输出一个字节到端口5。
XLAT换码
(3)地址传送指令
LEA有效地址送寄存器
LDS指针送寄存器和DS
LES指针送寄存器和ES
LFS指针送寄存器和FS
LGS指针送寄存器和GS
LSS指针送寄存器和SS
1LEA
LEAREG,SRC
把源操作数的有效地址送到指定的寄存器中
2LDS、LES、LFS、LGS、LSS指针送寄存器和段寄存器指令
LDSREG,SRC
把SRC的偏移地址放到REG中,又把偏移地址(SRC+2)放到DS中
(4)标志寄存器传送指令
LAHF标志送AH
SAHFAH送标志寄存器
PUSHF/PUSHFD标志进栈
POPF/POPFD标志出栈
(5)类型转换指令
CBW字节转换为字
CWD字转换为双字
CDQ双字转换为4字
BSWAP字节交换
以CWD为例,把AX的内容扩展到DX,DX为高位,AX为低位。
如果AX最高有效位=1,(DX)=0FFFFH;
如果AX的最高有效位=0,(DX)=0。
CBW为AL扩展至AH,形成AX
CDQ为EAX扩展至EDX,形成EDX:
EAX
II.算术指令
(1)加法指令
ADD加法
ADDDST,SRC
把DST与SRC的和放入DST中
ADC带进位加法
ADCDST,SRC
把DST、SRC与进位标志CF的和放入DST中
INC加1
INCOPR
OPR加一
XADD交换并相加
XADDDST,SRC
首先把DST与SRC交换,然后把两数之和放入DST中。
(2)减法指令
SUB减法
SUBDST,SRC
把DST与SRC的差放入DST中
SBB带借位减法
SBBDST,SRC
把DST、SRC以及CF的差放入DST中
DEC减1
DECOPR
OPR减一
NEG求补
NEGOPR
把OPR按位操作求反以后加一,一般用于求相反数。
CMP比较
与SUB、SBB一样都是减法操作,不同的是CMP并不保留减法结果,只是改变标志位。
CMPXCHG比较并交换
CMPXCHG8B比较并交换8字节
(3)乘法指令
MUL无符号数乘法
IMUL有符号数乘法
乘法指令的目的操作数必须是累加器。
两个8位数相乘,结果放在AX中。
两个16位数相乘,高位放在DX中,低位放在AX中。
(4)除法指令
DIV无符号数除法
IDIV有符号数除法
除法指令与乘法指令的寻址方式相同
字节运算时目的操作数在AX中,结果的商放在AL中,余数放在AH中
字运算时目的操作数在DX高位字和AX低位字中,结果的商放在AX中,余数放在DX中
III.逻辑指令
(1)逻辑运算指令
AND逻辑与
OR逻辑或
NOT逻辑非
XOR异或
TEST测试
在这里,TEST与AND的功能是一样的,但是TEST的结果并不保存
(2)移位指令(结合课本73页的图以后课后习题3.27来复习)
SHL逻辑左移
每次将操作数的最高位移出并移到CF,最低位补0
SAL算数左移
SAL指令与SHL指令完全相同
SHR逻辑右移
每次将操作数的最低位移出并移到CF,最高位补0
SAR算数右移
把目的操作数的高位向低位移,空出的高位用最高位(符号位)填补,并把最低位存入CF
ROL循环左移
把目的操作数的最高位移到最低位,并进入CF中。
ROR循环右移
把目的操作数的最低位移到最高位,并进入CF中。
RCL带进位循环左移
整体往左移动,原CF的值填补空出的位,移出的位再进入CF
RCR带进位循环右移
整体往右移动,原CF的值填补空出的位,移出的位再进入CF
(3)串处理指令
MOVS串传送
包括MOVS、MOVSB、MOVSW、MOVSD四种格式,该操作指令的功能为:
把DS:
SI所指向的变量传送到ES:
DI中。
一般用法为:
LEAsi,source_buffer把源缓冲区的偏移地址放入si中
LEAdi,dest_buffer把目的缓冲区的偏移地址放入di中
CLD清除方向位DF,方向为从低位向高位进行
MOVcx,n设置要传送的变量个数n
REPmovsb重复串传送,从ds:
si到es:
di
CMPS串比较
该指令是把指针DS:
SI和ES:
DI所指向字节、字或双字的值相减,CX为比较的个数,并用所得到的差来设置有关的标志位,变址寄存器SI和DI也将根据标志位DF的值作相应增减。
想要比较两个字符是否相等,就要观察ZF的情况,为1则相等,为0则不想等
SCAS串扫描
该指令是用指针ES:
DI所指向字节、字或双字的值与相应的AL、AX或EAX的值相减,用所得到的差来设置有关标志位。
与此同时,变址寄存器DI还将根据标志位DF的值进行增减。
LODS从串取
从由指针DS:
SI所指向的内存单元开始,取一个字节、字或双字进入AL、AX或EAX中,并根据标志位DF对寄存器SI作相应增减。
该指令的执行不影响任何标志位。
STOS存入串
该指令是把寄存器AL、AX或EAX中的值存于以指针ES:
DI所指向内存单元为起始的一片存储单元里,并根据标志位DF对寄存器DI作相应增减。
该指令不影响任何标志位。
INS串输入
该指令是从某一指定的端口接受一个字符串,并存入一片存储单元之中。
输入端口由DX指定,存储单元的首地址和读入数据的个数分别由ES:
DI和CX来确定。
在指令的执行过程中,还根据标志位DF对寄存器DI作相应增减。
OUTS串输出
该指令是把一个字符串输入到指定的输出端口中。
输出端口由DX指定,其输出数据的首地址和个数分别由DS:
SI和CX来确定。
在指令的执行过程中,还根据标志位DF对寄存器SI作相应增减。
REP重复
REPE/REPZ相等、为零则重复
REPNE/REPNZ不相等、不为零则重复
对于以上重复指令,若cx=0则停止执行重复。
(4)控制转移指令
①无条件转移JMP
3条件转移
1根据单个条件设置转移
JZ(JE)等于零(相等)则转移
JNZ(JNE)不等于零(不想等)则转移
JS结果为负则转移
JNS结果为正则转移
JO溢出则转移
JNO不溢出则转移
JP(JPE)奇偶位为1则转移
JNP(JPO)奇偶位为0则转移
JB(JNAE、JC)低于(不高于,等于,进位为1)则转移
JNB(JAE、JNC)不低于(高于,等于,进位为0)则转移
2无符号数比较
JNB(JAE、JNC)不低于(高于,等于,进位为0)则转移
JBE(JNA)低于,等于(不高于)则转移
JNBE(JA)不低于,等于(高于)则转移
3有符号数比较
JL(JNGE)小于(不大于,等于)则转移
JNL(JGE)不小于(大于,等于)则转移
JLE(JNG)小于,等于(不大于)则转移
JNLE(JG)不小于,等于(大于)则转移
③循环设置
LOOP循环
LOOPZ/LOOPE为零/等于时循环
LOOPNZ/LOOPNE不为零/不等于时循环
共同的循环退出条件为CX=0
4子程序
CALL调用
RET返回
5中断
INT中断
(4)处理机控制与杂项操作指令
①标志处理指令
CLC进位位设置为0
STC进位位设置为1
CLD方向标志位设置为0
STD方向标志位设置为1
CLI中断标志位设置为0
STI中断标志位设置为1
②其他
NOP无操作
第三章例题
例3.50设X、Y、Z均为双精度数(双字),它们分别存放在地址为X,X+2,Y,Y+2,Z,Z+2的存储单元中,存放时高位字在高地址中,低位字在低地址中。
在808680286中可用下列指令序列实现W<
—X+Y+24-Z
并用W和W+2单元存放运算结果。
movax,x;
把x的低位放入ax中
movdx,x+2;
把x的高位放入ax中
addax,y;
该语句实现x+y,结果放入ax中
adcdx,y+2;
带进位加法x+y,加上进位标志CF
addax,24;
ax+24即x+y的低位加上24
adcdx,0;
高位加0
subax,z;
x+y+24的低位与z的低四位相减
sbbdx,z+2;
x+y+24高位与z的高四位带借位减
movw,ax;
把最终结果放入w中
movw+2,dx
例3.56算术运算综合举例,计算:
(V-(X*Y+Z-540))/X
其中X,Y,Z,V均为16位带符号数,已分别装入X,Y,Z,V单元中,要求上式计算结果的商存入AX,余数存入DX寄存器。
编制程序如下:
movax,x;
把x放入ax中
imuly;
x乘以y,高位放入dx中,低位放入ax中
movcx,ax;
把结果存入cx,bx中
movbx,dx
movax,z;
把z放入ax中
cwd;
ax转化为双字类型,AX的符号位去填充DX
addcx,ax;
该步实现x*y+z,加法指令
adcbx,dx;
带进位加法指令
subcx,540;
该步实现x*y+z-540,减法指令
sbbbx,0;
带借位减法指令
movax,v;
把v放入ax中
subax,cx;
该步实现v-(x*y+z-540),减法指令
sbbdx,bx;
idivx;
该步实现(v-(x*y+z-540))/x,有符号数除法
;
商放入AX中,余数放入DX中
第三章习题解释
3.4
(1)这是立即寻(AX)=1200H
(2)这是寄存器寻(AX)=(BX)=0100H
(3)这是直接寻AX的物理地址=DS*10H+1200H=21200H,字内容(21200)=4C2AH
(4)这是寄存器间接寻AX的物理地址=DS*10H+0100H=20100H,字内容(20100)=3412H
(5)这是寄存器相对寻AX的物理地址=DS*10H+0100H+1100=21200H
字内容(21200)=4C2AH
(6)这是基址变址寻AX的物理地址=DS*10H+0100H+0002H=20102H
字内容(20102)=7856H
(7)这是相对基址变址寻AX的物理地址=DS*10H+1100H+0100H+0002H=21202H
字内容(21202)=65B7H
3.8
因为立即寻和寄存器寻不在内存中寻找,因此不存在物理地址。
(1)立即数寻址无
(2)寄存器寻址无
(3)直接寻址20100H
物理地址=DS*10H+100H
(4)直接寻址20050H
物理地址=DS*10H+50H
(5)寄存器间接寻址20100H
(6)寄存器间接寻址21100H
物理地址=ES*10H+100H
(7)寄存器间接寻址15010H
物理地址=SS*10H+100H(BP关联的段寄存器为SS)
(8)寄存器间接寻址200A0H
物理地址=DS*10H+A0H
(9)寄存器相对寻址2010AH
物理地址=DS*10H+100H+10d+
(10)寄存器相对寻址20150H
物理地址=DS*10H+100H+50H
(11)基址变址寻址201A0H
物理地址=DS*10H+100H+A0H
(12)相对基址变址寻址201F0H
物理地址=DS*10H+100H+A0H+50H
3.27
(1)DX=0000000001011100B
开始时DX=0000000010111001B,逻辑右移1位,最高位为零,因此最高位补零
(2)DX=0000000000010111B
开始时DX=0000000010111001B,算术右移3位,最高位补三个0
(3)DX=0000010111001000B
开始时DX=0000000010111001B,逻辑左移3位,最低位补三个-0
(4)DX=0000000001110010B
开始时DX=0000000010111001B,DL=10111001B,逻辑左移1位,DL的最低位补0
因此DL=01110010B,因此DX=0000000001110010B
(5)DX=0001000000010111B
开始时DX=0000000010111001B,循环右移3位,分别从低位移动3个二进制位到高位,
(6)DX=0000000011001101B
开始时DX=0000000010111001B,DL=10111001B,循环左移3位,分别从高位移动3个二进制位到高位,DL=11001101B,DX=0000000010111001B
(7)DX=0000000010111001B
开始时DX=0000000010111001B,DH=00000000,算术左移1位,DH=00000000
因此DX=0000000010111001B
(8)DX=0000010111001100B
开始时DX=0000000010111001B,带进位循环左移3位,移动的同时把进位标志CF挤出来,最终CF=0。
因此DX=0000010111001100B
(9)DX=0000000011011100B
开始时DX=0000000010111001B,DL=10111001B,带进位循环右移1位,移动的同时把进位标志CF挤出来,最终CF=1,DL=11011100B,DX=0000000011011100B
第四章
1.伪操作
伪操作又成为伪指令,它们不像机器指令那样是在程序运行期间由计算机来执行的,而是在汇编程序对源程序汇编期间由汇编程序处理的操作,它们可以完成如处理器选择、定义程序模式、定义数据、分配存储区、指示程序结果等功能。
2.数据定义及存储器分配伪操作
I.数据类型定义
DB(定义字节,占用1字节)、DW(定义字,占用2字节)、DD(定义双字,占用34字节)、DQ(定义4字,占用8字节)
II.复制操作符DUP
例4.10
ARRAY1DB2DUP(0,1,2,?
)
ARRAY2DB100DUP(?
它与ARRAY1DB0,1,2,?
0,1,2,?
是等价的
例4.11
ARRAY3DB100DUP(0,2DUP(1,2),0,3)
它与ARRAY3DB100DUP(0,1,2,1,2,0,3)是等价的
III.表达式赋值伪操作EQU
其功能为赋值,EQU伪操作中的表达式名是不允许重复使用的,EQU复制在内存中不占用空间。
IV.地址计数器与对准伪操作
地址计数器$
地址计数器$用来保存当前正在汇编指令的偏移地址。
ORG伪操作
ORG伪操作用来设置当前地址计数器的值。
如常数表达式的值为n,ORG伪操作可以使下一个字节的地址成为常数表达式的值n
例如:
datasegment
ADB10H
ORG100H
BDB10H
dataends
如果A的偏移地址为0000,那么B的偏移地址为0101.
V.数值回送操作符
SEG回送变量或标号的段地址值
OFFSET回送变量或标号的偏移地址值
实验报告二的解释
开始时org100h,下一条语句yournamedb'
20093592zhengzhiwei'
的偏移量为100h,
从13ED:
0100开始为该语句的第一位,db定义了字符串yourname中的字符为字节变量,各占一个字节,因此yourname占19个字节,末位的i在13ED:
0112,数字0-9的ASCII码为30h-39h,因此从13ED:
0100开始的8位为3230303933353932
小写字母a-z的ASCII码为61h-7ah,因此从13ED:
0108开始的11位字母为7A68656E677A6869776569,
data_bytedb10,4,10h中10为10进制数,转换为16进制,为0Ah,db定义字节变量
因此从13ED:
0113开始的3个数分别为0A0410
data_worddw100,100h,-5中的变量为字变量,100为十进制,转换为十六进制,为0064h,100h依然为0100h,-5为带符号数,负数,把5转换为2进制,0000000000000101,求反码,1111111111111010,反码加一为补码,1111111111111011,转换为十六进制,为FFFB,因此从13ED:
0116开始的6个字节为,6400,0001,FBFF
data_dwdd3*20,0fffdh中的变量为双字变量,占用4个字节,3*20=60=3Ch,在内存中表示为3C000000,0fffdh在内存中表示为,FDFF0000。
011C开始的8个字节为3C000000,FDFF0000
messagedb'
ABC'
中的变量为字节变量,大写字母A-Z的ASCII码为,41-5A,因此,’ABC’在内存中表示为414243.从13ED:
0124开始的3个字节为414243
msgdw'
AB'
中的变量为字变量,’AB’为一个字,高位为41,低位为42,因此从13ED:
0127开始的2个字节为4241.
array1db2dup(0,1,2,?
),这是字节变量的二维数组,内容为0,1,2,?
,0,1,2,?
因此在内存中表示为0001020000010200,从13ED:
0129开始的8个字节为0001020000010200
array3db2dup(0,2dup(3,4),0,5),这是字节变量的三维数组,内容为0003040304000500030403040005,从13ED:
0131开始的14个字节为0003040304000500030403040005。
array2dw1,2,3,这是自变量的数据,内容为1,2,3.在内存中表示为0100,0200,0300.因此,从13ED:
013F开始的6个字节为010002000300。
最后一位为13ED:
0134
byte_arraylabelbyte、constantequ256、squareconequ256*256这三条语句不占用内存空间。
array4dw$,$+4,3,4,$+4中的变量为字变量,$用于计算当前位置的偏移地址,从图书可知,第一个$所在偏移地址为0145,因此在内存中表示为4501,第二个$所在的偏移地址为0147,$+4为014B,因此在内存中表示为4B01,而3,4则表示为03000400,因为最后一位00所在偏移地址为014C,因此下一