好文档 - 专业文书写作范文服务资料分享网站

第3章 部习题参考答案

天下 分享 时间: 加入收藏 我要投稿 点赞

第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,得到个位数

ADD BVAR, AL ;加个位数,得到转换结果,直接存放到BVAR存储单元

MOV AH,4CH INT 21H

CODE ENDS END

;返回操作系统的功能编号

;执行操作系统功能调用,当AH=4cH时,返回操作系统

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

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]

N5: MOV DX,DI

ret begin endp code ends

end begin

3-5 题目略stack segment 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

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?

MOV AH,9 INT 21H

?stack? assume ss:stack,cs:code,ds:data push ds sub ax,ax push ax

mov ax,data mov ds,ax

第3章 部习题参考答案

第3章课后习题参考答案3-1写出执行下列程序段的中间结果和结果(1)MOVAX,0809HMULAH;AX=AL*AH=48HAAM;AX=0702H(2)题目略?AX=0059H(BCD除之前,先用AAD是将BCD数先转换为二进制数,非压缩BCD码0
推荐度:
点击下载文档文档为doc格式
3lhvp27rfy8mpoj7ocb09o8y29wtcx00z0g
领取福利

微信扫码领取福利

微信扫码分享