第3章 部分习题参考答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第3章课后习题参考答案
3-1 写出执行下列程序段的中间结果和结果
(1)MOV AX, 0809H
MUL AH ;AX=AL*AH=48H
AAM ;AX=0702H
(2)题目略
●AX=0059H
(BCD除之前,先用AAD是将BCD数先转换为二进制<十六进制>数,非压缩BCD码0809H表示的数值89,转换为十六进制数为59H)
●DIV DL ;AX=0411H ;商89/5=17=11H保存在AL,余数=4保存在AH,故AX=411H
MOV DL,AH ;余数送DL,DL=04H
●AAM ;乘法调整,将AL中的二进制转换为非压缩BCD码→AX,AX=0107H,;
;最后AX=0107和,DL=04H
(3) AX=0011H, AX=0107H
(4) AX=005AH(MUL AH; AL=09,AH=10=0Ah,9*0AH=5AH),
AX=0900H(调整后变为BCD数,5AH=90),
AX=0908H(xchg AH,DL将AH中的08H交换到DL,执行ADD AL,DL,AL=00+08=08H,故AX=0908H)(5) AL=62H
(6) AX=0248H (该程序段:将AX先初始化为0,然后将CL的最高位移到进位位C,利用字节加法分两次进行AX*2+C,并进行压缩的BCD加法调整,分析代码可知该段代码是将CL中的二进制数转换为BCD码并保存在AX中。程序代码 MOV CL ,248经汇编,CL中存放的是十进制数248对应的二进制数CL=11111000B,因此程序执行完毕,AX=0248H)
3-2 题目略
一个压缩的BCD数, 0~99. 转换方法:十位*10+个位。
stack segment stack 'stack'
dw 32 dup(0)
stack ends
data segment
BVAR DB 99H
data ends
code segment
assume ss: stack , cs: code, ds: data
BEGIN: MOV AX, DATA ; 将数据段首地址送AX
MOV DS,AX ; 将数据段首地址送DS
MOV AL, BVAR ;取出待转换BCD数
MOV CL, 4
SHR AL, CL ;右移4位,得到BCD数的十位(右移时,高四位补0)
MOV AH, 10 ;
MUL AH ;十位数*10
AND BVAR, 0FH ;BCD数高四位清0,得到个位数
第 1 页共 24 页 1
ADD BVAR, AL ;加个位数,得到转换结果,直接存放到BVAR存储单元
MOV AH,4CH ;返回操作系统的功能编号
INT 21H ;执行操作系统功能调用,当AH=4cH时,返回操作系统CODE ENDS
END
3-3 题目略
stack segment stack 'stack'
dw 32 dup(0)
stack ends
data segment
W1 DW 0807H
W2 DW 0609H
B3 DB 2 DUP(0)
data ends
code segment
assume ss:stack,cs:code,ds:data
START: MOV AX,DATA
MOV DS,AX
MOV AX, W1 ;AX=0807H
SUB AL,BYTE PTR W2 ;AL=FEH, CF=1
AAS ;AL=08H, AH=07H
MOV B3, AL
MOV AL,AH
SUB AL,W2+1
MOV B3+1,AL
MOV AH,4CH
INT 21H
CODE ENDS
END
3-4 题目略
使用另一种返回操作系统的方法:在对汇编源程序进行汇编/链接生成可执行的.EXE程序时,操作系统自动在数据段最开始DS:0000H处放置一条返回操作系统的指令,因此,只要将DS和0000压入堆栈,并将程序编写为远过程(远调用的子程序),然后在执行完程序规定的功能后,在程序的最后用一条RET指令,RET自动将DS弹出送到CS,将0000弹出送到IP,就会转到数据段开始执行返回操作系统的指令,使程序能够返回操作系统。
stack segment stack 'stack'
dw 32 dup(0)
stack ends
data segment
D1 DD 06070809H
D2 DD 04050607H
OBF DB 6 DUP(0)
data ends
code segment
2
第 2 页共 24 页
begin proc far ;远过程,返回时,从堆栈弹出四字节送CS:IP
assume ss:stack,cs:code,ds:data
PUSH DS ;压栈DS
SUB AX,AX ;ax=0
PUSH AX ;0000压入堆栈
MOV AX,DATA
MOV DS,AX ;数据段段基址 DS
MOV SI,0
MOV DI,OFFSET OBF+5
MOV BYTE PTR[DI],'$'
MOV CX,4
XOR AH,AH
AGAIN: MOV AL, BYTE PTR D1[SI]
ADD AL, BYTE PTR D2[SI]
ADD AL,AH
MOV AH,0
AAA
ADD AL,30H
DEC DI
MOV [DI],AL
INC SI
LOOP AGAIN
AND AH,AH
JZ N5
DEC DI
MOV BYTE PTR[DI],'1'
N5: MOV DX,DI
MOV AH,9
INT 21H
ret
begin endp
code ends
end begin
3-5 题目略
stack segment stack 'stack'
dw 32 dup(0)
stack ends
data segment
W1 DW 8931H
W2 DW 5678H
OBF DB 6 DUP(0)
data ends
code segment
begin proc far
assume ss:stack,cs:code,ds:data
push ds
sub ax,ax
push ax
第 3 页共 24 页 3