汇编语言程序设计合工大版习题参考答案.docx
- 文档编号:6886757
- 上传时间:2023-01-12
- 格式:DOCX
- 页数:81
- 大小:53.53KB
汇编语言程序设计合工大版习题参考答案.docx
《汇编语言程序设计合工大版习题参考答案.docx》由会员分享,可在线阅读,更多相关《汇编语言程序设计合工大版习题参考答案.docx(81页珍藏版)》请在冰豆网上搜索。
汇编语言程序设计合工大版习题参考答案
5.13字数组ARRAY,第一个单元为元素个数N,后面为N个元素,编写程序,把零元素从数组中清除,移动元素位置并修改第一个单元(元素个数)。
;deletethe0fromarray
datasegment
arraydw6,3,4,0,15,0,7
locadw999;此单元地址为结束标记
dataends
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax
movcx,array
leabx,array+1
next:
cmpwordptr[bx],0
jzmove
addbx,2
deccx
cmpcx,0
jnznext
jmpexit
move:
decarray
movdi,bx
mnext:
cmpdi,offsetloca
janext
movax,[di+2]
mov[di],ax
adddi,2
cmpdi,offsetloca
jnbnext
jmpmnext
exit:
movah,4ch
int21h
codeends
endstart
5.14下表为奥运会获金牌前十名国家的成绩统计表,请编写程序,统计并填写表中的合计栏数据。
;先逐行求小计,再按列求合计。
datasegment
arraydb1,0,1,?
;设简单数据
db1,1,0,?
db1,1,0,?
db1,1,1,?
db1,1,1,?
db1,1,1,?
db1,1,1,?
db1,1,1,?
db1,1,1,?
db1,1,1,?
org30h
sumvddb?
?
?
?
;存放按列求的合计数
org40h
locadw?
;存放array的第一行地址
dataends
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax
movax,0
movcx,10
leabx,array
sumh:
movdi,3
sum3:
addal,[bx]
incbx
decdi
jnzsum3
mov[bx],al;存放行的小计
movax,0
incbx
loopsumh
;下面按列求合计
leabx,array
movloca,bx
leasi,sumvd
movcx,10
movdi,4
sumv3:
movax,0
movbx,loca
sumv:
addal,[bx]
addbx,4
loopsumv
mov[si],al
movcx,10
incsi
incloca
decdi
jnzsumv3
exit:
movah,4ch
int21h
codeends
endstart
6.1过程定义如下,补充括号中的指令。
codesegment
assumecs:
code
mainprocfar
(PUSHDS)
(XORAX,AX)
(PUSHAX)
…
…
…
ret
mainendp
codeends
endmain
6.2补充下列程序括号中的指令,使得程序对堆栈的操作全部利用程序中定义的TOS堆栈,并画出程序执行后堆栈TOS中的数据。
datasegment
dw100dup(?
)
toslabelword
dataends
codesegment
assumecs:
code,ss:
data
mainprocfar
(MOVAX,DATA)
(MOVSS,AX)
(LEASP,TOS)
pushds
xorax,ax
pushax
callfarptrsuba
…;假定此处指令的地址为cs=3400h,ip=30h
…
…
codeends
endmain
6.3以下两个独立程序模块,互相用到对方的变量和标号,你认为哪一个是主模块?
程序有没有错误?
应该如何修改?
答:
m1.asm是主模块,因为它有callm2,但没有说明外部符号,而m2必须是过程名,var4,lab2也没有说明外部符号。
var1,var2没有说明为PUBLIC。
应加上:
EXTRNm2:
FAR,var4:
WORD
PUBLICvar1,var2,lab1
并修改datasegment为datasegmentPUBLIC
同理M2.asm应加上:
EXTRNvar1:
byte,var2:
word
extrnlab1:
FAR
PUBLICt603b,var4
并修改datasegment为datasegmentPUBLIC
以上完成主要修改,但程序依然有错,请仔细检查操作数类型是否匹配。
;m1.asm如下:
datasegment
var1db?
var2dw?
var3dw?
dataends
code1segment
assumecs:
code1,ds:
data
mainprocfar
start:
…
movax,data
movds,ax
…
callm2
lab1:
movax,var4
…
jmplab2;去掉此指令
…
mainendp
code1ends
endstart
;m2.asm如下:
datasegment
var4dw?
var5dw?
dataends
code2segment
assumecs:
code2,ds:
data
m2procfar
…
adddx,var1;var1为字节类型
adddx,var2
jmplab1
…
M2endp
code2ends
end
6.4主程序从键盘输入N位二进制数到缓冲区,用子程序将其转换为二进制数串显示。
主程序和子程序共用数据缓冲区。
datasegment
buffdb9,?
9dup(?
)
dataends
codesegment
assumecs:
code,ds:
data
mainprocfar
start:
movax,data
movds,ax
leadx,buff
movah,10
int21h
calloutp
exit:
movah,4ch
int21h
mainendp
outpprocnear
movah,2
movdl,10
int21h
movcl,buff+1
movch,0
leabx,buff+2
out1:
movdl,[bx]
movah,2
int21h
incbx
loopout1
ret
outpendp
codeends
endstart
6.5主程序从键盘输入一个字符串到BUFF,再输入一个字符到AL,用子程序在字符串BUFF中查找是否存在该字符,如果找到,显示发现的字符位置。
用寄存器传递要查找的字符。
;search
datasegment
mess1db13,10,'inputstring:
$'
mess2db13,10,'inputachar:
$'
mess3db13,10,'notfound!
$'
mess4db13,10,'foundat:
$'
org40h
bufflabelbyte
max1db9
act1db?
stok1db9dup(?
)
dataends
codesegment
assumecs:
code,ds:
data
mainprocfar
pushds
subax,ax
pushax
movax,data
movds,ax
moves,ax
leadx,mess1
movah,09
int21h;qust1?
leadx,buff
movah,0ah
int21h;ans1
leadx,mess2
movah,09
int21h;qust2?
movah,1
int21h;ans2
callnearptrscan
ret
mainendp
scanprocnear
movcl,act1
movch,0
leadi,stok1
repnescasb
jefound
nofd:
leadx,mess3
movah,9
int21h
jmpexit
found:
leadx,mess4
movah,9
int21h
subact1,cl
movdl,act1
adddl,30h
movah,2
int21h
exit:
ret
scanendp
codeends
endmain
6.6编写程序,从键盘输入一个字符串到BUFF,用子程序统计各字符出现的次数。
错误!
;numbersofeverychartobefound
;ababc
;0b0bc
;0000c
;00000
datasegment
mess1db13,10,'inputstring:
$'
mess2db13,10,'inputachar:
$'
mess3db13,10,'notfound!
$'
mess4db13,10,'foundat:
$'
org40h
bufflabelbyte
max1db9
act1db?
stok1db9dup(?
)
dataends
codesegment
assumecs:
code,ds:
data
mainprocfar
pushds
subax,ax
pushax
movax,data
movds,ax
leadx,mess1
movah,09
int21h;qust1?
leadx,buff
movah,0ah
int21h;ans1
callnearptrscan
ret
mainendp
scanprocnear
movcl,act1
movch,0
movdl,30h
send:
leadi,stok1
k1:
cmpbyteptr[di],20h
jekong
cmpbyteptr[di],13
jeones
movbl,[di]
movbyteptr[di],20h
k2:
incdl
incdi
cmpbl,[di]
jecnum
cnum:
movbyteptr[di],0
ones:
movah,2
int21h
loopsend
kong:
incdi
jmpk1
movsi,di
moval,[si]
cmpal,20h
jenext
cmpal,[di]
jnenext
incdl
next:
incdi
loop
nextcmp
repnescasb
jefound
nofd:
leadx,mess3
movah,9
int21h
jmpexit
found:
leadx,mess4
movah,9
int21h
subact1,cl
movdl,act1
adddl,30h
movah,2
int21h
exit:
ret
scanendp
codeends
endmain
6.7主程序从键盘输入一个八位的二进制数,对其作求补操作,用子程序对求补后的值以二进制形式显示。
codesegment
assumecs:
code
mainprocfar
start:
movbx,0
movcx,8
next:
movah,1
int21h
cmpal,30h
jbexit
cmpal,31h
jaexit
subal,30h
shlbl,1
addbl,al
loopnext
negbl
calloutp
exit:
movah,4ch
int21h
mainendp
outpprocnear
movah,2
movdl,10
int21h
movcx,8
kp:
shlbl,1
jck1
movdl,30h
jmpkk
k1:
movdl,31h
kk:
movah,2
int21h
loopkp
ret
outpendp
codeends
endstart
6.8主程序从键盘输入两个四位的十六进制数A和B,用子程序作十六进制计算A+B,并显示计算结果。
;onlyacceptprintchar:
0~9,A~F
codesegment
assumecs:
code
mainprocfar
start:
movax,cs
movds,ax
leadx,mess
movah,9
int21h
movsi,2
inone:
movdx,0
movbx,0
movch,4
movcl,4
next:
movah,1
int21h
subal,30h
cmpal,0
jbexit
cmpal,9
jachar
jmpk1
char:
subal,7
cmpal,0ah
jbexit
cmpal,0fh
jaexit
k1:
movdl,al
shlbx,cl
addbx,dx
decch
jnznext
pushbx
movah,2
movdl,13
int21h
movah,2
movdl,10
int21h
decsi
jnzinone
calloutp
exit:
movah,4ch
int21h
mainendp
outpprocnear
movbp,sp
movax,[bp+2]
movbx,[bp+4]
addbx,ax
movch,4
movcl,4
out1:
rolbx,cl
movdx,bx
anddl,0fh
adddl,30h
cmpdl,39h
jaad7
jmpkp
ad7:
adddl,7
kp:
movah,2
int21h
decch
jnzout1
ret
outpendp
messdb'onlyaccept0-9,A-F,input:
',13,10,'$'
codeends
endstart
6.9某字数组为有符号数,第一个单元为元素个数N,后面为N个元素,编写通
用子程序,求数组元素中的最大值,并把它放入MAX单元。
;putthebigtomaxlocation
datasegment
arraydw5,9,4,5,15,3
maxdw?
dataends
codesegment
assumecs:
code,ds:
data
mainprocfar
movax,data
movds,ax
movcx,array
leabx,array+1
callnearptrgetmax
movah,4ch
int21h
mainendp
getmaxprocnear
movax,[bx]
movmax,ax
k1:
movax,[bx]
cmpax,max
jlnext
movmax,ax
next:
addbx,2
loopk1
ret
getmaxendp
codeends
endmain
6.10某字数组,第一个单元为元素个数N,后面为N个元素,编写通用子程序,把零元素从数组中清除,移动元素位置并修改第一个单元(元素个数)。
;deletethe0fromarray
datasegment
arraydw6,3,4,0,1,0,5
locadw999
dataends
codesegment
assumecs:
code,ds:
data
mainprocfar
movax,data
movds,ax
movcx,array
leasi,array
leabx,array+1
callnearptrdele0
movah,4ch
int21h
mainendp
dele0procnear
next:
cmpwordptr[bx],0
jzmove
addbx,2
deccx
cmpcx,0
jnznext
jmpexit
move:
decwordptr[si]
movdi,bx
mnext:
cmpdi,offsetloca
janext
movax,[di+2]
mov[di],ax
adddi,2
cmpdi,offsetloca
jnbnext
jmpmnext
exit:
ret
dele0endp
codeends
endmain
部分习题参考答案
1.5下列各数均为十进制数,请采用8位二进制补码运算,并回答标志寄存器FLAGS中CF和OF的值,运算结果所代表的十进制数是多少?
如果用16位二进制补码运算,其结果所代表的十进制数是多少?
FLAGS中CF和OF的值呢?
(1)85+69
(2)85+(-69)(3)85-(-69)(4)85-(69)
85=55H,69=45H,-69=BBH,
8位二进制补码运算:
(1)85+69=55H+45H=9AH,CF=0,OF=1
(2)85+(-69)=55H+BBH=110H,CF=1,OF=0
其余略
1.6实模式下,写出段地址和偏移地址为1234:
2002、1430:
0042、FF00:
0FFF的物理地址。
1234:
2002=12340+2002=14342
1430:
0042=14300+0042=14342
FF00:
0FFF=FF000+0FFF=FFFFF
1.7已知8086系统某存储单元物理地址为:
52506H,你认为段基址的最大值、最小值分别是多少?
8086微机最多可以有多少个不同的段基址?
52506=5250:
0006,段基址的最大值=5250
52506=4251:
FFF6,段基址的最小值=4251
1.8从物理地址为00100H开始到00103H单元中顺序存放的数据为:
12H,34H,56H,78H。
请画出数据存放示意图,并回答以下问题:
(1)写出00101H字节单元的内容
(00101)=34H
(2)写出00102H字单元的内容
(00102)=7856H
习题3
3.1分别说明8086处理器中各寄存器的名称和作用是什么?
3.2溢出标志OF与进位标志CF有何作用和区别?
3.3何为段地址?
何为有效地址?
何为物理地址?
用指令举例说明。
3.4带符号数比较大小,当AX 后续指令应为什么? 若视为二个无符号数比较大小,后续指令应为什么? 带符号数: JLL1,无符号数: JBL1 3.5ADD指令和ADC指令在什么情况下是一样的结果? CF=0 3.6说出CALL指令和INT21H指令的操作,有何异同? CALL把断点压入堆栈,不一定是远调,INT21H还要把FLAGS压入堆栈,且是远调,总入口地址为84H内存中的两个字。 3.7除了用4CH号系统功能调用结束程序的执行并退出,还有哪些办法? RET指令,INT20H 3.8指出下列错误的指令,说出错误原因,并给出合适的修改。 (1)MOVAX,[DX]/MOVAX,[BX] (2)MOVDS,DATA/MOVDS,BX (3)MOVCS,AX/MOVES,AX (4)MOVAX,DL/MOVAL,DL (5)PUSHAL/PUSHAX (6)ADD[BX],[DI]/ADD[BX],DI (7)LEA[BX],[2000H]/LEABX,[2000H] (8)MOV[BX],OFFSET[2000H] (9)MOV[SI],2/MOVBYTEPTR[SI],2 (10)MULBX,CX/MULBX (11)DIV5/DIVBX (12)MOVBYTE[SI],2/MOVBYTEPTR[SI],2 (13)MOVAX,[SI+DI]/MOVAX,[BX+SI] (14)SHRAX,4/SHRAX,1 (15)CMP6,AX/CMPAX,6 (16)MOV[FFFF],AX/MOV[FFFE],AX (17)MOVAX,BX+4/MOVAX,[BX+4] (18)JMPFARPRO/JMPFARPTRPRO 3.9假定(DS)=1200H,(SS)=4400H,(BX)=463DH,(BP)=2006H,(SI)=6A00H,位移量D=4524H,以AX寄存器为目的操作数,试写出以下各种寻址方式下的传送指令,并确定源操作数的有效地址EA和物理地址。 (1)立即寻址;操作数的EA就是指令的EA/操作数在指令中/无EA (2)直接寻址;EA=4524H,物理地址=DS: 4524 (3)使用BX的寄存器寻址;无EA (4)使用BX
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 程序设计 合工大版 习题 参考答案
![提示](https://static.bdocx.com/images/bang_tan.gif)