文档库 最新最全的文档下载
当前位置:文档库 › 最新第3章习题答案讲课教案

最新第3章习题答案讲课教案

最新第3章习题答案讲课教案
最新第3章习题答案讲课教案

3-1

1. AX=0048H,AX=0702H

2. AX=0059H, AX=0411H, AX=0107H,DL=04H

3. AX=0011H, AX=0107H

4.AX=005AH, AX=0900H, AX=0908H

5. AL=62H

6. AX=0248H

3-2

stack segment stack 'stack'

dw 32 dup(0)

stack ends

data segment

BVAR DB 99H

data ends

code segment

begin proc far

assume ss: stack , cs: code, ds: data

push ds

sub ax, ax

push ax

mov ax, data

mov ds, ax

MOV AL, BVAR

MOV CL, 4

SHR AL, CL

MOV AH, 10

MUL AH

AND BVAR, 0FH

ADD BVAR, AL

ret

begin endp

code ends

end begin

先将2位压缩BCD数转换为非压缩BCD数,再用AAD指令将非压缩BCD数转换为二进制数:MOV AL, BVAR

MOV AH, AL

MOV CL, 4

SHR AH, CL

AND AL, 0FH

AAD

MOV BVAR, AL

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

begin proc far

assume ss:stack,cs:code,ds:data

push ds

sub ax,ax

push ax

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

ret

begin endp

code ends

end begin

还可以用AAD指令将两个非压缩BCD数转换为二进制数,相减后再用AAM将差转换为非压缩BCD数:MOV AX, W2

AAD

MOV DX,AX

MOV AX,W1

AAD

SUB AX,DX

AAM

MOV BYTE PTR B3,AX

3-4

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

assume ss:stack,cs:code,ds:data

push ds

sub ax,ax

push ax

mov ax,data

mov ds,ax

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

mov ax,data

mov ds,ax

MOV DI,0

MOV AL, BYTE PTR W1 ;AL=31H

ADD AL, BYTE PTR W2 ;AL=A9H, CF=0, AF=0

DAA ;AL=09H, CF=1

MOV AH, AL

MOV AL, BYTE PTR W1+1 ;AL=89H

ADC AL, BYTE PTR W2+1 ;AL=E0H, CF=0, AF=1

DAA ;AL=46H, CF=1

PUSHF

MOV DI OFFSET OBF+5

MOV BYTE PTR[DI], '$'

MOV CL,4

XCHG AH,AL

AGAIN: MOV DL,0FH

AND DL,AL

ADD DL,30H

DEC DI

MOV [DI],DL

SHR AX,CL

AND AX,AX

JNZ AGAIN

POPF

JNC OUTPUT

DEC DI

MOV BYTE PTR[DI], '1'

OUTPUT: MOV DX,DI

MOV AH,9

INT 21H

begin endp

code ends

end begin

3-6

stack segment stack 'stack'

dw 32 dup(0)

stack ends

data segment

BVAR DB 99H

OBUF DB 4 DUP(0)

data ends

code segment

begin proc far

assume ss: stack, cs: code, ds: data

push ds

sub ax, ax

push ax

mov ax, data

mov ds, ax

MOV AL ,BVAR ;二进制数送AL

MOV AH, 0 ;二进制数扩展为16位(无符号数扩展)

MOV DL, 100

DIV DL

ADD AL, 30H ;将百位变为ASCII码

MOV OBUF, AL ;存百位

MOV AL,AH ;将十位和个位的二进制数即余数送AL

AAM ;将AL中的二进制数转换为ASCII BCD数

ADD AX,3030H ;将AX中的ASCII BCD数变为ASCII码

MOV OBUF+1,AH

MOV OBUF+2,AL

MOV OBUF+3,'$'

MOV DX,OFFSET OBUF

MOV AH,9

INT 21H

ret

begin endp

code ends

end begin

将8位二进制数转换为十进制数也可以用除10取余法实现。转换程序段如下:MOV AL,BVAR

XOR AH,AH ;将8位二进制数扩展为16位(无符号数扩展)

MOV DL,10

DIV DL

ADD AH,30H ;将第一个余数即个位变为ASCII码

MOV OBUF+2,AH

XOR AH,AH ;将AL中的二进制数扩展为16位

DIV DL

ADD AX,3030H ;AH为十位,AL为百位

MOV WORD PTR OBUF,AX

MOV OBUF+3,'$'

还可以用左移二进制数的方法将二进制数转换为十进制数:

XOR AX,AX ;清0AX

MOV CX,8 ;左移二进制数8次

AGAIN: SHL BVAR, 1

ADC AL, AL

DAA

ADC AH, 0 ; AH的值小于等于2不需校正

LOOP AGAIN

ADD AH, 30H ;百位转换为ASCII码

MOV OBUF, AH

MOV AH, AL ;保存十位和个位

MOV CL, 4

SHR AL, CL ;BCD数十位移至AL低4位

AND AH, OFH ;BCD数个位在AH低4位

ADD AX, 3030H ;个位和十位转换为ASCII码

MOV WORD PTR OBUF+1, AX

MOV OBUF+3, '$'

以二进制数11111101B转换为BCD数0253H为例,说明转换的过程,全过程如下图所示。

3-7

stack segment stack 'stack'

dw 32 dup(0)

stack ends

data segment

TAB DW 0

DB '0 $'

DW 1

DB '1 $'

DW 8

DB '8 $'

DW 64000

DB '64000$'

LFZ DW 0

IBUF DB 3,0,3 DUBP(0)

data ends

code segment

begin proc far

assume ss: stack, cs: code, ds: data

push ds

sub ax, ax

push ax

mov ax, data

mov ds, ax

MOV DX, OFFSET IBUF

MOV AH, 10

INT 21H

MOV AH, 2

MOV DL, 0AH

INT 21H

MOV AX, WORD PTR IBUF+2 ;个位送AH,十位送AL

XCHG AH,AL ;个位与十位交换

CMP IBUF+1,2 ;判别N是一位数还是二位数

JE COM

MOV AL,AH

XOR AH,AH;;若N为一位数,则要清AH

COM: AND AX, 0F0FH ;将AX中的ASCII码变为ASCII BCD数AAD ;将AX中的ASCII BCD数变为二进制数

MOV CL,3

SHL AX,CL ;将AX中的二进制数乘以8

MOV BX,AX

MOV AX,TAB [BX]

MOV LFZ,AX

MOV DX,OFFSET TAB+2 ;DX指向立方值的ASCII码

ADD DX,BX ;将DX下移8N,指向N的ASCII码

MOV AH,9

INT 21H

ret

begin endp

code ends

end begin

3-8

stack segment stack 'stack'

dw 32 dup(0)

stack ends

data segment

WA DW 0ABCDH

BA DB 0

data ends

code segment

begin proc far

assume ss: stack, cs: code, ds: data

push ds

sub ax, ax

push ax

mov ax, data

mov ds, ax

MOV AH, 1 ;1号功能调用,键入i(i=0~3)

INT 21H

MOV DX,WA

TEST AL,1 ;判别键入数i是奇数还是偶数,D0位为0则为偶数

JZ NRS

MOV CL, 4 ;i为奇数将a3、a1移至各自字节的低4位

SHR DX, CL

NRS: TEST AL,2 ;判别键入数i的D1位是0还是1?

JZ HNSL

MOV DL, DH ;i的D1位为1则是取a3或a2,将其送DL HNSL: AND DL, 0FH ;取低4位

MOV BA, DL

相关文档