汇编期末课后整理.docx
《汇编期末课后整理.docx》由会员分享,可在线阅读,更多相关《汇编期末课后整理.docx(17页珍藏版)》请在冰豆网上搜索。
汇编期末课后整理
习题二
13有一个32K字节的存储区,首地址是3302:
5AC8H,写出其首单元和末单元的物理地址。
首单元的物理地址=38AE8H,末单元的物理地址=38AE8H+7FFFH=40AE7H
15存储单元地址和内容表示如下,请画出存储单元存放形式。
(1)(1280A)=3456H
(2)(20021H)=4DH(3)(33450H)=37A520D1H
16根据逻辑地址计算出物理地址,并解释逻辑地址与物理地址的对应关系。
(1)2389:
3DE9H
(2)1230:
EC92H(3)14D9:
C202H
(1)物理地址=27679H
(2)物理地址=20F92H(3)物理地址=20F92H
(2)和(3)的物理地址是一样的。
说明逻辑地址不唯一,多个逻辑地址可对应到同一个物理单元上。
17给出段地址和偏移地址如下,计算出对应的物理地址。
(CS)=54C3H,(ES)=2569H,(DS)=1200H,(SS)=4422H,
(BX)=5678H,(SP)=9945H,(IP)=0E54H,(DI)=63B1H
代码段CS:
IP的物理地址=55A84H堆栈段SS:
SP的物理地址=4DB65H
数据段DS:
BX的物理地址=17678H附加段ES:
DI的物理地址=2BA41H
18已知堆栈区大小为512字节,栈底单元的物理地址为15230H。
将两个字入栈保存后,当前栈指针所指单元的物理地址是多少?
堆栈区中还能保存多少个数据?
当前栈指针所指单元的物理地址是1522CH。
堆栈区中还能保存254个字。
习题四
21写出指令,用压缩BCD码实现下列运算:
(1)Y1=56+34
(2)Y2=128-35
(3)Y3=68+23-45
查看正确答案
(1)MOVAL,56H
MOVBL,34H
ADDAL,BL
DAA
MOVY1,AL
(2)MOVAX,128H
MOVBX,35H
SUBAX,BX
DAS
MOVY2,AL
(3)MOVAL,68H
MOVBL,23H
ADDAL,BL
MOVBL,45H
SUBAL,BL
DAS
MOVY3,AL
22写出指令,用非压缩BCD码实现下列运算:
(1)Z1=78+46
(2)Z2=95-27
(3)Z3=12×6-33
(4)Z4=(74+18)/6
查看正确答案
(1)MOVAX,0708H
MOVBX,0406H
ADDAL,BL
ADDAH,BH;不用带进位加
AAA;加法调整,含进位调整
MOVBX,AX
XCHGAH,AL;高4位调整
AAA
MOVBH,AL
MOVZ1,BX;保存十位、各位,百位在CF中
(2)MOVAX,0905H
MOVBX,0207H
SUBAL,BL
SUBAH,BH;不用带借位减
AAS;减法调整
MOVZ2,AX
(3)MOVAX,0102H
MOVBX,0006H
MULBX;乘法先不用调整
MOVBX,0303H
SUBAX,BX
AAS;减法调整
MOVZ3,AX
(4)MOVAX,0704H
MOVBX,0108H
ADDAL,BL
ADDAH,BH
AAA;加法调整
MOVBL,6
AAD;除法调整
DIVBL
MOVBH,AH;余数保存在BH
ANDAX,000FH
AAA;商调整
MOVZ4,AX;保存商
26编写程序,建立一个0~9的平方根表,查表可得某数的平方根。
查看正确答案
datasegment
xdb'0.000','1.000','1.414','1.732','2.000'
db'2.236','2.449','2.646','2.828','3.000';建立字符表
ydb5dup(?
);存放查到平方根
udb3;要查的数
dataends
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax
moval,u;要查的数
movcl,5
mulcl;u*5=15(号单元开始)
movah,0
movbx,ax;地址保存到bx
movsi,0
let1:
moval,x[bx];取出平方根数字
movy[si],al;存入y
incsi
incbx
looplet1;循环取出5次
movah,4ch
int21h
codeends
endstart
29编写程序段,将AL中的数乘以6,与CL相减后再除以3;把商保存到Y单元,余数保存到Y+1单元。
查看正确答案
.modelsmall
.data
ydb?
?
.code
start:
movax,@data
movds,ax
moval,3;设al=3
movcl,6
mulcl;al*6
movcl,4;设cl=4
subal,cl;相减
movbl,3
idivbl;/3
movy,al;商
movy+1,ah;余数
movah,4ch
int21h
endstart
习题五
27分支程序设计。
完成如下公式的计算,请写出程序。
(X+3)/2X>0
Y=0X=0
X×4X<0
查看正确答案
分支程序设计。
完成如下公式的计算,请写出程序。
(X+3)/2X>0
Y=0X=0
X×4X<0
程序如下:
DATASEGMENT
XDB23
YDB?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVAL,X
CMPAL,0
JESUB2
JGSUB1
MOVCL,2
SALAL,CL
JMPSHORTSUB2
SUB1:
ADDAL,3
SARAL,1
SUB2:
MOVY,AL
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
28设X、Y、Z为字节单元。
如果X≥0,Z=4X-Y/16,否则,Z=X的绝对值。
编程序实现。
查看正确答案
设X、Y、Z为字节单元。
如果X≥0,Z=4X-Y/16,否则,Z=X的绝对值。
编程序实现。
程序如下:
DATASEGMENT
XDB3
YDB5
ZDB?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVAL,X
CMPAL,0
JLSS1
MOVCL,2
SALAL,CL
MOVBL,Y
MOVCL,4
SARBL,CL
SUBAL,BL
JMPOUT1
SS1:
NEGAL
OUT1:
MOVZ,AL
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
29字数组M中有10个数据,分类统计其中正数、负数、0的个数,分别存入POSI、NEGA、ZERO单元。
查看正确答案
字数组M中有10个数据,分类统计其中正数、负数、0的个数,分别存入POSI、NEGA、ZERO单元。
程序如下:
DATA1SEGMENT
MDW21,-34,32,112,-324,0,76,0,48,50
POSIDW?
NEGADW?
ZERODW?
DATA1ENDS
CODE1SEGMENT
ASSUMECS:
CODE1,DS:
DATA1
START:
MOVAX,DATA1
MOVDS,AX
MOVCX,10
LEASI,M
AGAIN:
CMPWORDPTR[SI],0
JLLOWER
JEEQUAL
INCPOSI
JMPLPP1
LOWER:
INCNEGA
JMPLPP1
EQUAL:
INCZERO
LPP1:
ADDSI,2
DECCX
JNZAGAIN
MOVAH,4CH
INT21H
CODE1ENDS
ENDSTART
31编程。
将AX寄存器中的16位数分成4组,每组4位,从低到高分别放在AL,BL,CL,DL中。
查看正确答案
编程。
将AX寄存器中的16位数分成4组,每组4位,从低到高分别放在AL,BL,CL,DL中。
程序段:
START:
MOVAX,1234H
MOVBX,AX
ANDAL,0FH;4
ANDBL,0F0H;3
ANDAH,0FH
MOVCL,AH;2
ANDBH,0F0H
MOVDL,BH;1
习题六
15写出计算Y=1×2+3×4+5×6+7×8+9×10的程序段。
查看正确答案
计算Y=1×2+3×4+5×6+7×8+9×10的程序段答案:
MOVAL,1
MOVBL,2
MOVDX,0
MOVCX,5
AA1:
MULBL
ADDDX,AX
INCBL
MOVAL,BL
INCBL
LOOPAA1
17写程序段。
在长度为N的字数组VALUE中统计负数的个数并保存到AX中。
查看正确答案
写程序段。
在长度为N的字数组VALUE中统计负数的个数并保存到AX中。
valuedw2,-4,-5,3,6,6,-8
nequ($-value)/2;元素个数
……
start:
movax,data
movds,ax
movcx,n
movbx,0
movax,0
rept1:
movsi,value[bx];取出元素
cmpsi,0
jgelet1;≥0转let1
incax;为负数,ax加1
let1:
addbx,2
looprept1
18编程。
从键盘输入一个数字,在屏幕上显示出以该数字开始的10个数字串。
查看正确答案
从键盘输入一个数字,在屏幕上显示出以该数字开始10个数字串。
CODESEGMENT
ASSUMECS:
CODE
START:
MOVAH,1
INT21H
MOVCX,10
MOVBL,AL
REPT1:
CMPBL,'9'
JLENEXT
SUBBL,10
NEXT:
MOVDL,BL
MOVAH,2
INT21H
INCBL
LOOPREPT1
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
19编程。
比较两个字符串是否相同,统计并显示出相同的字符个数和不同的字符个数。
查看正确答案
datasegment
bunch1db'stadent'
bunch2db'studEnt'
dataends
codesegment
assumecs:
code,ds:
data,es:
data
start:
movax,data
movds,ax
moves,ax
leasi,bunch1
leadi,bunch2
movbx,0;bh=相同的个数,bl=不同的个数
movcx,7
let1:
moval,[si]
cmpal,[di];两字符比较
jzequl;相同转equl
incbl;不同bl加1
jmpout1
equl:
incbh
out1:
incsi
incdi
looplet1
movdl,'n';显示'n',代表不同
movah,2h
int21h
addbl,30h;加上ASCII码
movdl,bl;显示不同的个数
int21h
movdl,'e';显示'e',代表相同
int21h
addbh,30h
movdl,bh;显示相同的个数
int21h
movah,4ch
int21h
codeends
endstart
习题七
23写出对内存单元X中的补码求真值子程序,补码保存在BX中。
查看正确答案
calcuproc
pushax
pushbx
pushsi
movax,0
moval,x
andal,al
jnszz
negal
movfuhao,'-'
zz:
movsi,0
movbx,10;将ax变为十进制数真值
let1:
movdx,0
incsi;统计余数个数
idivbx
movy[si],dx;在y单元保存余数
cmpax,0
jnzlet1
popsi
popbx
popax
ret
calcuendp
28写出对AX中的二进制数按位相加子程序。
30编制一个计算数组中所有负数之和的子程序。
并利用此子程序分别计算A数组和B数组中的负数之和,结果分别放在SUM1和SUM2单元中。
查看正确答案
DATASEGMENT
ADB9,-8,-7,6,5
BDB-8,7,6,-5,4
SUM1DB?
SUM2DB?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVCX,5
MOVSI,OFFSETA
CALLLADD
MOVSUM1,BL
MOVSI,OFFSETB
CALLLADD
MOVSUM2,BL
MOVAH,4CH
INT21H
LADDPROCNEAR
PUSHCX
PUSHAX
PUSHSI
XORBL,BL
NEXT:
MOVAL,[SI]
ANDAL,AL
JNSJJJ
ADDBL,AL
JJJ:
INCSI
LOOPNEXT
POPSI
POPAX
POPCX
RET
LADDENDP
CODEENDS
ENDSTART
习题八
21定义宏。
完成两个操作数相乘,乘积在第3个操作数中。
MmulmacroA,B,C
Moval,A
Movbl,B
Mulbl
MovC,ax
23定义键盘输入一个字符的宏指令INPUT。
Inputmacro
Movah,01h
Int21h
endm
24定义显示一个字符的宏指令OUTPUT,要显示的字符用哑元DISP表示。
OutputmacroDISP
Movdl,DISP
Movah,2
Int21h
endm
25定义宏指令KEY_STR,实现从键盘输入一串字符。
key_strmacroopr1
movdx,offsetopr1
movah,10
int21h
endm
26定义宏指令DISPLAY,显示一串字符。
displaymacroopr1
leadx,opr1
movah,9
int21h
endm
27利用宏指令INPUT和OUTPUT实现将键入的大写字母变为小写显示。
查看正确答案
程序:
.modelsmall
.stack100h
.code
start:
input;键盘输入
addal,20h;大写变为小写
outputal;显示
movah,4ch
int21h
endstart
习题九
38编写读取时钟计数器的值,经过变换产生百位以内随机数的程序。
查看正确答案
程序如下:
include9-4.mac
.modelsmall
.data
letter1db'Timestart=','$'
letter2db'Timeend=','$'
letter3db'Timetotal=','$'
inputdb100,102dup(?
)
hourdb?
minutesdb?
secondsdb?
persecdb?
contdb0
.code
start:
movax,@data
movds,ax
clearsc;清屏
cursor2,50;置光标
movah,9
movdx,offsetletter1;显示串1
int21h
sss:
;读时间并显示
movah,2ch;CH=小时,CL=分,DH=秒,DL=百分秒
int21h
movbx,0
movbl,ch
calldisp_2_10;显示小时
displ':
';显示:
movbx,0
movbl,cl
calldisp_2_10;分
displ':
';显示:
movbx,0
movbl,dh
calldisp_2_10;秒
displ':
';显示:
movbx,0
movbl,dl
calldisp_2_10;百分秒
subch,hour;计算时间差
subcl,minutes
subdh,seconds
subdl,persec
movhour,ch;保存时间差
movminutes,cl
movseconds,dh
movpersec,dl
inccont
cmpcont,2;显示2次时间
jzout1
cursor7,10;置输入光标
movdx,offsetinput;键盘输入
movah,10
int21h
cursor3,50;置光标
;显示串2
movah,9
movdx,offsetletter2
int21h
jmpsss
out1:
cursor4,50;置光标
movah,9
movdx,offsetletter3;显示串3
int21h;显示时间差
movcx,3
movsi,offsethour
movbx,0
www:
movbl,[si];取出时、分、秒
calldisp_2_10;3次调用
displ':
';显示:
incsi
loopwww
movah,4ch
int21h
;子程序。
二-十进制数转换。
bx值用十进制显示。
disp_2_10proc
store_ss;保护现场
movax,bx;bx传参
movcx,0
movbx,10;将ax变为十进制数
let1:
movdx,0
inccx;统计余数个数
idivbx
pushdx;保存余数
cmpax,0
jnzlet1
let2:
;显示结果
popax;将余数弹入ax
addax,0030h;调整为ascii码
movdl,al
movah,2
int21h
looplet2
restore_ss;恢复现场
ret
disp_2_10
endp
endstart