汇编复习资料.docx
《汇编复习资料.docx》由会员分享,可在线阅读,更多相关《汇编复习资料.docx(40页珍藏版)》请在冰豆网上搜索。
汇编复习资料
一、80X86微型计算机的组织
1-12、在实模式操作下,段寄存器的用途是什么?
解:
段寄存器是用来定义数据段得起始地址的。
在实模式下,它定义一个最大64KB存储段的起点。
补充:
IBM-PCI/O空间是64K(0000H~FFFFH)。
1-15、实模式存储器地址允许访问低于哪个地址的存储区?
解:
(段能够位于存储器的几乎所有地方,大小可变,)在实模式下,存储器寻址允许访问低于(FFFF:
FFFF)地址的存储区。
1-18、堆栈存储器由(堆栈)段加(堆栈指针)偏移的组合来寻址。
(就指明了正被寻址的堆栈中的当前字。
)
知识点补充:
(SS)+(SP)=堆栈中的当前字的地址
1-19、如果指针(BP)寻址存储器,则寻址的数据在(堆栈)段中。
知识点补充:
(SS)+(BP)=堆栈中的数据的地址
1-2080286工作在实模式下,给出下列寄存器组合所寻址的存储单元地址。
(a)DS=1000H和DI=2000H
(b)DS=2000H和SI=1002H
(c)SS=2300H和BP=3200H
(d)DS=A000H和BX=1000H
(e)SS=2900H和SP=3A00H
解:
(a)12000H(b)21002H(c)26200H
(d)A1000H(f)2CA00H
知识点:
(CS)+(IP)=下一条指令的地址
(DS)+(BX)=数据段中数据的地址
(DS)+(DI)=数据段中数据的地址
(DS)+(SI)=数据段中数据的地址
(DS)+(16位立即数)=数据段中数据的地址
物理地址=(段地址)*10H+偏移地址
通用寄存器:
AX:
主累加器.用于有关输入/输出和大多数算术运算操作.例如,乘法,除法。
BX:
基址寄存器,可以用作扩展寻址的变址
CX:
计数寄存器
DX:
数据寄存器
变址寄存器
SI:
16位源变址寄存器,与DS相关联。
DI:
16位目的变址寄存器,与ES相关联。
段寄存器:
(段寄存器包含段的起始地址)
SI,DI,IP(指令指针寄存器,IP是和CS寄存器相关联的),FLAGS,CS,DS,ES,SS,FS,GS;
堆栈指针(SP)寄存器:
包含了在堆栈中被寻址的当前字的偏移地址,SP和BP寄存器与SS寄存器相关联.
2、单选
1.十六进制数88H可以被其他形式的数所表示,下列哪种表示方法是错的?
D
A.无符号十进制136C.BCD码88
B.带符号十进制–120D.带符号数据–8
解:
A、88H=8*8^0+8*8^1=136B、88H=10001000末位减1=10000111按位求反01111000直接得-120
C、BCD:
二进制码十进制数D、-8绝对值8,8H=00001000取反得11110111再加1=11111000化成十六进制为:
F8H不等于88H(利用的是求补运算的原理)
2、如果DH=10H,执行NEGDH指令,正确的结果是(D).
A.DH=10HC=1C.DH=10HC=0
B.B.DH=0F0HC=0D.DH=0F0HC=1
解:
NEG是汇编中指令中的求补指令(将操作数按位取反后加1)。
10H=00010000B
按位取反:
11101111B
+1=11110000B=0F0H取反加一的时候产生了进位,所以CF=1,所以选D(CF进位标志carryFlag,如果运算结果的最高位产生了一个一个进位或错位那么其值就为1,否则为0)
3.哪个是指令指针寄存器?
A
A.IPB.SPC.BPD.PSW(程序状态字)
解:
B、SP:
堆栈指针寄存器C、BP:
(BasePointer),基址指针寄存器。
D、PSW:
程序状态寄存器
4.如果AX=1000H,
NEGAX
NEGAX
上面两条指令执行后,AX=(C).
a.1001Hb.1002Hc.1000Hd.0F000H
解:
做两次求补运算即返回其本身。
2.2有两个16位的字1EE5H和2A3CH存储在IBMPC的000B0H和000B03H的内存单元中,请以图表的形式说明内存中的存储情况
解:
按照高高低低的原则,低内存地址中内容放在低字节
高内存地址中内容放在高字节,在存储器中,每个字都有唯一的地址。
内存地址内容
000B4H2AH
000B3H3CH
000B2H
000B1H1EH
000B0HE5H
2.3如下图,展示的是IBMPC的内存信息,请说明30022H字节单元和30024H字节单元的内容,和30021H字单元和30022H字单元的内容。
存储器
30020H12H
30021H34H
30022HABH
30023HCDH
30024HEFH
解:
30022H字节单元的内容=0ABH,30024H字节单元的内容=0EFH,30021H字单元的内容=01234H,30022H字单元的内容=034ABH。
(先高后低,当前字节内容加上当前字节地址加1的内容)
2.43017:
000A的段地址的物理地址和偏移量是什么?
3015:
002A和3010:
007A的段地址和偏移是什么?
解:
冒号前为段地址,冒号后为偏移地址。
物理地址1:
PA=3017×10H+000AH=3017AH
物理地址2:
PA=3015×10H+002AH=3017AH
物理地址3:
PA=3010×10H+007AH=3017AH
2.5、2.5运行程序之前,(CS)=0A7F0H,(IP)=2B40H,程序的第一个字的物理地址是什么?
解:
CS:
IP
物理地址为:
PA=(CS)×10H+(IP)0A7F0*10H+2B40=0AAA40
2.6在内存中,每一段都顶多有10000H字节。
下面是用DEBUG的命令“r”来在终端上展示寄存器的内容。
请以图表的形式显示内存是如何划分成段的,还有OF,SF,ZF,CF的值。
解:
详解看PPT
数据段
附加段
堆栈段
代码段
此时OF,SF,ZF,CF都为0.
2.8哪类型的寄存器可以用来显示内存地址
解:
CS,DS,ES,SS,EAX,EBX,ECX,EDX,EBP,EIP,ESP,EDI,IP,SP,BP,BX,DI,SI
(BX、BP、SI、DI、SP与对应的段地址。
)
5.假定DS=5788H,偏移地址94H,字节的PA(物理地址)是(B).
a.57974Hb.57914Hc.5883Hd.58ECH57880*10H+94=57914H(物理地址=(段地址)*10H+偏移地址)
6.在段中寻址的时候,在8086CPU的寄存器中,哪些寄存器可以提供偏移地址(B)
A.AX,BX,CX,DXC.SP,IP,BP,DX
B.BX,BP,SI,DID.CS,DS,ES,SS
解:
断CS,SS,DS,ES分别对应的偏移地址:
IP,SP或BP,
BX、DI、SI或16位数,串指令的DI。
第2章寻址方式与汇编语言程序的组织
重要知识点:
当有两个操作数的时候:
(在指令中)
第二个操作数是源操作数,与立即数或者地址相关联(寄存器,内存或者I/O端口的地址),源数据在操作中不会被更改。
第一个操作数是目标操作数,放在寄存器中,内存中,或者I/O端口中。
寻址方式:
它是一种指令中操作数地址的表达形式。
1、寄存器寻址:
操作数在CPU的寄存器中。
寄存器可以充当第一或第二操作数,也可以两个都是。
由于在寄存器之间处理数据不用访问存储器,所以是最快的操作类型。
源寄存器的大小需要与目标寄存器的大小统一。
DW:
定义一个字。
2、立即寻址:
第二操作数是立即数或者表达式(第一操作数不能是立即数,可以是寄存器、内存单元、I/O端口的地址)
例子:
MOVAX,25
MOVcount,AX
立即操作数必须与目标操作数大小相一致(不能超过),两个同为字节,字或者双字。
比访问内存中的数据段中的数字常量,并且用MOV操作,这种处理方式更快。
3、直接寻址:
使用指令中操作数的偏移地址(EA,有效地址)直接指向内存中操作数的位置。
一个操作数与内存单元有关,而其他操作数与寄存器有关。
DS是访问存储器中数据的默认段寄存器。
4、寄存器间接寻址:
操作数的地址,存储在指令指明的内存单元地址中。
操作数的EA(有效地址)/偏移地址在BX,BP,DI和SI寄存器中.操作数在内存中。
使用的寄存器是BP,BX,DI和SI,写在方括号内。
处理堆栈中的数据时,BP(EBP)与SS是关联在一起的,SS:
BP。
为了处理数据段中的数据,BX,DI和SI与DS联系在一起:
DS:
BX,DS:
DI和DS:
SI。
(附加:
“ES:
”指明一个段前缀操作符,也就意味着“代替DS段寄存器的正常使用,获取其他段得数据。
”
MOVAX,ES:
[BX])
5、寄存器相对寻址:
操作数的EA是基址寄存器的内容或变址寄存器加指令指定的移位计数。
位移计数是8位或者16位.
EA=(寄存器)+位移计算
BX
PA=10H*(DS)+DI+8位/16位位移计数
SI
PA=10H*(SS)+(BP)+8位/16位位移计数
不要把两个基本寄存器.[BX+BP]或变址寄存器[DI+SI]组合在一起。
6、基址变址寻址:
操作数的EA是基本寄存器的内容加上变址寄存器的内容。
EA=(基本寄存器)+(变址寄存器)
在实模式下:
PA=16d*(DS)+(BX)+(SI)or(DI)
OrPA=16d*(SS)+(BP)+(SI)or(DI)
编写格式:
MOVAX,[BX][SI]
或MOVAX,[BX+SI]
7、相对基址变址寻址:
EA=(基本寄存器)+(变址寄存器)+8/16位偏移
实模式下:
PA=16d*(DS)+(BX)+(SI)/(DI)+8/16位偏移
PA=16d*(SS)+(BP)+(SI)/(DI)+8/16位偏移
编写格式:
MOVAX,ARRAY[BX][SI]
ORMOVAX,ARRAY[BX+SI]
ORMOVAX,[ARRAY+BX+SI]
注意:
立即数寻址与寄存器寻址不用计算有效地址。
2-1下面的MOV指令完成什么操作?
(a)MOVAX,BX;MOV指令完成把BX寄存器中的数据传送到AX寄存器中
(c)MOVBL,CH;指令完成把BL寄存器中的数据传送到CH寄存器中
2-2列出寄存器寻址使用的8位寄存器。
解:
AH、AL、BH、BL、CH、CL、DH和DL
2-3列出寄存器寻址使用的16位寄存器
解:
AX、BX、CX、DX、SI、DI、SP、BP和段寄存器:
SI、DI、IP、FLAGS、CS、DS、ES、SS、FS和GS
2-6指令MOVBL,CX错在哪里?
解:
BL是8位寄存器,而CX是16位寄存器。
2-7指令MOVDS,SS错在哪里?
解:
DS是访问存储器中数据的默认段寄存器,而SS同样为寄存器,两个段寄存器之间不能进行数据传送。
2-13指令MOV[BX],[DL]错在哪里
解:
目标操作数寻址方式错误,应该改为:
MOVBX,[DL]为寄存器间接寻址。
2-17给定DS=1200H,BX=0100H和SI=0250H。
假定按实模式操作,确定下面每条指令寻址的地址:
(a)MOV[100H],DL;12100H
(c)MOVDL,[BX+100H];12200H
解:
(a)为寄存器直接寻址:
PA=(DS)*10H+EA=1200*10+100=12100H
(b)为寄存器相对寻址:
PA=(DS)*10H+EA+(BX)=12200H
2-18给定DS=1100H,BX=0200H,LIST=0250和SI=0500H。
假定按实模式操作,确定下面每条指令寻址的地址:
(b)MOVCL,LIST[BX+SI];
解:
(b)为寄存器相对基址加变址寻址:
PA=(DS)*10H+BX+SI+8位或16位的位移量
PA=1100*10H+0200H+0500H+0250H=119500H
2-19给定DS=1300H,SS=1400H,BP=1500H和SI=0100H。
假定按实模式操作,确定下面每条指令寻址的地址:
(b)MOVAL,[BP+SI+200H];
解:
(b)为寄存器相对基址加变址寻址:
PA=(DS)*10H+BX+SI+8位或16位的位移量
PA=1300*10+1500+0100+200=14800H
2-20哪些基址寄存器可以寻址堆栈段的数据?
解:
SP,SS。
3.1给出(BX)=637DH,(SI)=2A9BH,偏移量D=7237H,尝试指出下列每一种寻址模式的有效地址。
(1)立即寻址;
(2)直接寻址;
(3)用BX的寄存器寻址;
(4) 用BX的寄存器间接寻址;
(5) 用BX的寄存器相对寻址;
(6) 基址变址寻
(7)相对基址变址寻
解:
(1)立即寻址:
指令在CPU中。
所以无
(2)直接寻址:
指令操作数的偏移地址(EA)直接指向内存中的操作数的位置。
所以EA=7237H
(3)寄存器寻址:
操作数在CPU内部的寄存器中,寄存器可以充当第一或第二操作数,也可以两个都是。
所以无
(4)寄存器间接寻址:
操作数所在内存单元的偏移地址在BX,BP,DI和SI寄存器中。
所以EA=637DH
(5)操作数的有效地址是一个基址或变址的内容和指令中指定的8位或16位位移量之和。
所以EA=D+[BX]=7237H+637DH=0D5B4H
(6)操作数的有效地址是一个基址寄存器和变址寄存器的内容之和,所以EA=[BX]+[SI]=637DH+2A9BH=8E18H
(7)操作数的有效地址是一个基址寄存器和变址寄存器的内容和8位或16位位移量之和。
所以EA=D+[BX]+[SI]=7237H+637DH+2A9BH=1004FH
3.2根据下列要求,写出相关的汇编语言指令。
(1) 把BX的内容和DX的内容相加,结果放入DX中。
(2) 把AL的内容加上内存地址的内容,并把结果放到AL中。
内存地址由BX和SI进行基址变址寻址所得。
(3)把CX的内容加上内存地址的一个字,并把结果放到内存地址中。
内存地址由BX和偏移量0B2H进行寄存器相对寻址所得。
(4) 把内存地址的内容与数2A59H相加,并把结果放入内存地址。
内存地址由偏移量0524H进行直接寻址所得。
(5) 把数值0B5H与AL寄存器的内容相加,结果放入AL寄存器。
解:
ADD
功能:
加法指令
语法:
ADDOP1,OP2
格式:
ADDr1,r2ADDr,mADDm,rADDr,data
影响标志:
C,P,A,Z,S,O
(1)ADDDX,BX
(2)ADDAL,BX[SI]
(3)ADDWORDPTR0B2H[BX],CX
(4)ADDWORDPTR[0524H],2A59H
(5)ADDAL,0B5H
3.3写出指令,把首址是BLOCK的字数组中的第六个字移入DX寄存器。
使用如下的寻址方式。
(1) 寄存器间接寻址
(2) 寄存器相对寻址
(3) 基址变址寻址
解:
LEA装入有效地址.
例:
LEADX,string;把偏移地址存到DX.
(1)LEABX,BLOCK+10
MOVDX,WORDPTR[BX]
(2)LEASI,BLOCK
MOVDX,WORDPTR0AH[SI]
(3)LEABX,BLOCK
MOVSI,0AH
MOVDX,WORDPTR[BX][SI]
3.4给出(DS)=2000H,(BX)=0100H,(SI)=0002H,(20100)=12H,(20101)=34H,(20102)=56H,(20103)=78H,(21200)=2AH,(21201)=4CH,(21202)=B7H,(21203)=65H,
尝试解释:
执行指令后,AX寄存器的内容。
(1)MOVAX,1200H
(3)MOVAX,[1200H]
(5)MOVAX,1100[BX]
(7)MOVAX,1100[BX][SI]
解:
(1)立即寻址:
(AX)=1200H
(3)寄存器直接寻址:
(AX)=4C2AH
(5)寄存器相对寻址:
(AX)=4C2AH
(7)基址加变址寻址:
(AX)=65B7H
3.8给出(DS)=2000H,(ES)=2100H,(SS)=00A0H,(BX)=0100H,(BP)=0010H,数据段中VAL的偏移地址是0050H,指出源操作数段得寻址方式和物理地址。
(2)MOVAX,BX
(4)MOVAX,VAL
(6)MOVAX,ES:
[BX]
(8)MOVAX,[SI]
(10)MOVAX,VAL[BX]
(12)MOVAX,VAL[BX][SI]
解:
(2)寄存器寻址
(4)直接寻址,PA=(DS)*10H+EA=2000*10+050=20050H
(6)寄存器间接寻址,PA=(DS)*10H+BX=21100H
(8)寄存器间接寻址,PA=(DS)*10H+SI=200A0H
(10)寄存器相对寻址,PA=(DS)*10H+EA+(BX)=20150H
(12)相对基址变址寻址,物理地址=201F0H
单选
1.当执行POP[BX]和寻找目标操作数时,段地址跟偏移地址是在()中。
a.无段地址也无偏移地址
b.DS和BX中
c.ES和BX中
d.SS和SP中
解:
选B
2.下列指令中,哪个是错的?
a.MOVSS:
[BX+DI],1000H
b.MOVDX,1000H
c.MOVWORDPTR[BX],1000H
d.MOVDS,2000H
解:
选d.错误:
MOV指令不能立即数传送到到段寄存器。
简答:
1.指出下列的错误:
(1)MOVAH,BX
(2)MOV[BX],[SI]
(3)MOVAX,[SI][DI]
(4)MOVMYDAT[BX][SI],ES:
AX
(5)MOVBYTEPTR[BX],1000
(6)MOVBX,OFFSETMYDAT[SI]
(7)MOVCS,AX
解:
(1)AH是8位寄存器,BX是16位寄存器。
(2)[BX],[SI]是内存单元,MOV指令不能实现内存到内存的传送。
(3)变址寄存器的内容只能是[SI]或[DI],两个不能同时放在一起。
(4)附加段寄存器ES:
存放当前执行程序中一个辅助数据段的段地址。
段寄存器偏移地址寄存器
CSIP
SSSP或BP
DSBX、DI、SI
ESDI(用于串指令)
MOV指令不能实现内存到内存的传送。
(5)BYTE指明的是字节类型,而10000需要的是16位的储存空间,位数不同。
(6)OFFSET:
变量或标号的偏移地址。
后面的[SI]是多余。
(7)寄存器寻址中的目的操作数不能是CS段寄存器。
2.给出DS=6400h,BX=0743h,SS=6500H,BP=CA40h,SI=2100h和DI=04A4h,而且BETA是一个偏移量为0202h的数据项(名称/变量),对于下列每一条指令指出其寻址方式且计算出源操作数和目标操作数的20-位的物理地址:
(i)MOVAL,[BP][SI]
(ii)MOV[BX+DI+4],AX
(iii)MOVBETA,BL
(iv)MOVAH,[BP][DI+BETA]
(v)LODSB
解:
根据各个寻址方式的PA的计算公式计算即可计算出:
(i)基址变址寻址72B40H
(ii)AX相对基址变址寻址64BEBH
(iii)直接寻址64202H
(iv)相对基址变址变址710E6
(v)寄存器寻址66100H
3.数据传送指令
3.10
TABLE是一个在数据段中0032上的符号,它的内容是1234H,下面指令有什么不同?
执行指令后AX寄存器的内容是什么?
MOVAX,TABLE
LEAAX,TABLE
解:
MOV指令实现把一个寄存器中的地址传送到另一个寄存器中储存。
而LEA指令把操作数规定数据的偏移地址装入16位或32位寄存器,即用偏移地址来初始化寄存器。
第1条指令:
AX=1234H
第2条指令:
AX=0032H
3.11执行下列指令后AX寄存器的内容是什么?
TABLEDW10,20,30,40,50
ENTRYDW3
·
·
·
MOVBX,OFFSETTABLE
ADDBX,ENTRY
MOVAX,[BX]
解:
AX=
3.13给出SS寄存器的内容是0FFA0H,和SP寄存器的内容是00B0H。
首先执行两个PUSH指令把8057H和0F79H压入栈中,然后执行POP指令.请以图表的形式给出栈的变化和SP的值(用下划线划出内存单元的物理地址).
解:
PUSH8057H
PUSH0F79H
POP
开始OOBOH
SP=00B0H
第二:
SP00AFH80H
第一:
SP=BL00AEH57H
SS=0FFA0H
00ADH0FH
第二:
SP=BL00ACH79H
00ABH
PUSH指令:
(SP)=(SP)-2
((SP+1)=(BH)
SP=BL
7.8下列指令中,符号ABCD是一个变量。
说出两条指令的不同。
MOVAX,OFFSETABCD
LEAAX,ABCD
解:
两条指令功能相同,都是取ABCD的偏移地址放进AX寄存器中,不过MOV指令能以较少的时间完成这个任务。
4.分析程序:
ADW1234H
BDW5678H
……
PUSHA
PUSHB
POPA
POPB
Reply:
①执行之后
(A)=5678H
(B)=1234H
②执行程序之前SP=200H,
执行之后SP=200H
4.
DATASEGMENT
ADB12H,’12’
BDW34H,45H
CDWB
DATAENDS
…………
在下列的指令完成之后,
排列主存储器中的数据段。
MOVAX,A+1;AX=
LEABX,B;BX=
MOVCX,C;CX=