汇编复习材料Word文件下载.docx
《汇编复习材料Word文件下载.docx》由会员分享,可在线阅读,更多相关《汇编复习材料Word文件下载.docx(14页珍藏版)》请在冰豆网上搜索。
由于80x86在存放字时,遵循低位字节存入低地址、高位字节存入高地址的原则,故
30022H和30024H字节单元的内容分别为0ABH和0EFH,30021H和30022H字单元的内容分别为0AB34H和0CDABH。
2.4在实模式下,段地址和偏移地址为3017:
000A的存储单元的物理地址是什么?
如果段地址和偏移地址3015:
002A和3010:
007A呢?
由于
3017H*16+000AH=3017AH,
3015H*16+002AH=3017AH,
3010H*16+007AH=3017AH,
故在实模式下,段地址和偏移地址为3017:
000A的物理地址为3017AH,如果段地址和偏移地址为3015:
002A和3010:
007A,其物理地址仍为3017AH。
3.1给定(BH)=637DH,(SI)=2A9BH,位移量D=7237H,试确定在以下各种寻址方式下的有效地址是什么?
(1)立即寻址
(2)直接寻址
(3)使用BX的寄存器寻址
(4)使用BX的间接寻址
(5)使用BX的寄存器相对寻址
(6)基址变址寻址
(7)相对基址变址寻址
(1)无;
(2)7237H;
(3)无;
(4)637DH;
(5)637DH+7237H=0D5B4H;
(6)637DH+2A9BH=8E18H;
(7)637DH+2A9BH+7237H=004FH
3.3写出把首地址为BLOCK的字数组的第6个字送到DX寄存器的指令。
要求使用以下几种寻址方式:
(1)寄存器间接寻址
(2)寄存器相对寻址
(3)基址变址寻址
(1)leabx,BLOCK+10
Movdx,[bx]
(2)movbx,10
Movdx,BLOCK[bx]
(3)leabx,BLOCK
Movsi,10
Movdx,[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,1200HAX=1200H
(2)MOVAX,BXAX=0100H
(3)MOVAX,[1200H]AX=4C2AH
(4)MOVAX,[BX]AX=3412H
(5)MOVAX,1100[BX]AX=4C2AH
(6)MOVAX,[BX][SI]AX=7856H
(7)MOVAX,1100[BX][SI]AX=65b7H
3.9在ARRAY数组中依次存储了七个字数据,紧接着是名为ZERO的字单元,表如下:
ARRAYDW23,26,2,100,32000,54,0
ZERODW?
(1)如果BX包含数组ARRAY的初始地址,请编写指令将数据0传送给ZERO单元
(2)如果BX包含数据0在数组中的位移量,请编写指令将数据0传送给ZERO单元
(1)movAX,[BX+12]
MovZERO,AX
(2)movAX,ARRAY[BX]
3.13已知堆栈段寄存器SS的内容是0FFA0H,堆栈指针寄存器SP的内容是00B0H,先执行两条把8057H和0F79H分别进栈的PUSH指令,在执行一条POP指令。
是画出堆栈区和SP的内容变化过程示意图(标出存储单元的物理地址)
3.23假设(BX)=0E3H,变量VALUE中存放的内容为79H,确定下列各条指令单独执行后的结果。
(1)XORBX,VALUEBX=9AH
(2)ANDBX,VALUEBX=61H
(3)ORBX,VALUEBX=0FBH
(4)XORBX,0FFHBX=1CH
(5)ANDBX,0BX=0H
(6)TESTBX,01HBX不变,ZF=0
3.25试用位移指令把十进制数+53和-49分别乘以2.它们应该用什么指令?
得到的结果是什么?
如果除以2呢?
答:
用SHL指令,得到的结果分别是6AH和9EH,即真值为106和-98。
如果除以2用SAL指令,得到的结果分别是1AH和0E7H,即真值为26和-25。
3.27
(1)DX=5CH
(2)DX=17H
(5)DX=2017H
(8)DX=05CCH
3.34书P112
(2)转向L1
(4)转向L3
3.36书P113
比较2p和q,如果2p>
q,返回DOS(AX=1);
否则返回DOS(AX=2)。
4.5画图说明下列语句所分配的存储空间及初始化的数据值
(1)BYTE_VARDB’BYTE’,12,-12H,3DUP(0,?
2DUP(1,2),?
)
(2)WORD_VARDW5DUP(0,1,2),?
-5,’BY’,’TE’,256H
BYTE_VAR
42H
59H
54H
45H
0CH
EEH
00H
?
01H
02H
WORD_VAR
0FBH
0FFH
56H
5.4试编写一程序,要求比较两个字符串STRING1和STRING2所含的字符是否相同,若相同现实’MATCH’,若不相同显示’N0MATCH’。
STACK1SEGMENTSTACK;
定义堆栈段
DB100DUP(?
);
堆栈段大小为100字节
STACK1ENDS
DATASEGMENT;
定义数据段
STRING1DB'
abcde$'
;
假定字符串以$结束
STRING2DB'
acedefgh$'
strmatchDB'
MATCH$'
strnmatchDB'
NOMATCH$'
DATAENDS
CODESEGMENT;
定义代码段
ASSUMECS:
CODE,DS:
DATA
MAINPROCFAR;
定义主函数
PUSHDS;
压断点(段地址和偏移地址)到堆栈
MOVAX,0
PUSHAX
MOVAX,DATA;
设DS为DATA段的段地址
MOVDS,AX
MOVSI,offsetSTRING1;
把字符串STRING1的起始地址给SI
MOVDI,offsetSTRING2;
把字符串STRING1的起始地址给DI
addr1:
MOVal,[SI]
cmpal,[di]
jnznomatch;
两个字符串不匹配
cmpal,'
$'
jzmatch;
两个字符串匹配
incsi
incdi
jmpaddr1
match:
MOVAH,9
LEADX,strmatch
INT21H;
输出"
MATCH"
jmpexit
nomatch:
LEADX,strnmatch
NOMATCH"
exit:
RET;
返回操作系统
MAINENDP
CODEENDS
ENDMAIN;
程序入口为MAIN
5.19已知数组A包含15个互不相等的整数,数组B包含20个互不相等的整数,试编一程序,把既在A中又在B中出现的整数存放于数组C中。
DATASEGMENT;
ADW2,3,5,4,7,9,56,45,67,789,22,33,44,55,66;
定义A数组
BDW3,5,4,13,9,25,45,43,789,22,33,44,73,66,2,98,97,96,123,134;
定义B数组
CDW15dup(?
存储结果
CODESEGMENT;
MOVSI,offsetA;
把数组A起始地址给SI
MOVDI,offsetC;
把数组C起始地址给DI
MOVCX,15;
把数组A元素个数给CX
cont1:
MOVAX,[SI];
从数组A中取出一个数
MOVDX,20;
把数组B元素个数给CX
MOVBX,offsetB;
把数组B起始地址给BX
cont2:
cmpAX,[BX];
判断是否和数组B中的一个数相等
jzbothexist;
同时在两个数组中
incBX
decDX
jnzcont2
jmpcont3
bothexist:
MOV[DI],AX
incDI
cont3:
incSI
incSI
loopcont1
RET;
5.22从键盘输入一系列字符(以回车符结束),并按字母、数字及其他字符分类计数,最后显示出这三类的计数结果。
MDW?
定义变量用来存放循环求十进制数各个位时的除数
RDW?
定义变量用来存放循环求十进制数各个位时的余数
LETTERDW0;
定义变量用来存放字母字符个数,初始化为0
DIGITDW0;
定义变量用来存放数字字符个数,初始化为0
OTHERDW0;
定义变量用来存放其他字符个数,初始化为0
MOVAX,DATA
MOVAH,1
int21H;
输入一个字符
cmpal,0dH
jzdisplay;
若遇到回车则输入结束
0'
判断是否为数字字符
jbnodigit
9'
janodigit
incDIGIT;
数字字符个数加1
jmpcont1
nodigit:
cmpal,'
A'
判断是否为大写字母
jbnodxletter
Z'
janodxletter
incLETTER;
字母字符个数加1
nodxletter:
a'
判断是否为小写字母
jbnoletter
z'
janoletter
jmpcont1
noletter:
incOTHER;
其他字符个数加1
display:
callCR_DISP;
输出回车
movBX,DIGIT
callBIN2DEC;
输出数字字符个数
movBX,LETTER
输出字母字符个数
movBX,OTHER
输出其他字符个数
;
子程序bin2dec完成将2进制数以十进制形式输出
输入参数:
BX,待输出的2进制数放在其中
BIN2DECPROC
PUSHDX
MOVM,10000;
循环初始状态
AGAIN:
MOVAX,BX
MOVDX,0
DIVM;
n/m:
商在ax(al)中,余数在dx中
MOVR,DX;
保存余数
MOVAH,2
MOVDL,AL
ADDDL,30H
输出商
MOVBX,R;
n=n%m
MOVAX,M
MOVM,10
DIVM
MOVM,AX;
m=m/10
CMPM,0
JNZAGAIN;
判断是否结束循环
MOVDL,'
d'
输出十进制数后缀'
CALLCR_DISP;
调用子程序输出回车换行
POPDX
POPAX
RET
BIN2DECENDP
CR_DISPPROCNEAR;
子程序CR_Disp用于输出回车换行
MOVDL,0AH
输出换行
MOVDL,0DH
CR_DISPENDP
ENDMAIN