汇编语言补充作业和答案

更新时间:2023-12-23 00:42:02 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

《微机系统与接口技术》汇编补充作业

1. 寻址方式小结。请根据已填的格式,完成下面表中的空白部分: 寻址方式 立即寻址 操作数物理地址(PA) 操作数由指令给出 指令格式举例 MOV DX, 100H; (DX)←100 MOV AX, BX; (AX)←(BX) MOV AX, [1234H] MOV AX, [BX] MOV AX, [SI] MOV AX, [DI] MOV AX, [BP] MOV AX, BUFF[BX] MOV AX, BUFF[BP] MOV AX, BUFF[SI] MOV AX, BUFF[DI] MOV AX, [BX][SI] MOV AX, [BX+DI] MOV AX, [BP][SI] MOV AX, [BP+DI] MOV AX, BUFF[BX][SI] MOV AX, BUFF[BX+DI] MOV AX, BUFF[BP][SI] MOV AX, BUFF[BP+DI] 寄存器寻址 操作数在寄存器中 直接寻址 寄存器间接寻址 操作数的有效地址由指令直接给出 (BX) PA=(DS)×16+(SI) (DI) 或=(SS)×16+(BP) PA=(DS) ×16+(BX)+位移量 PA=(SS) ×16+(BP)+位移量 PA=(DS) ×16+(SI)+ 位移量 PA=(DS) ×16+(DI)+ 位移量 PA=(DS) ×16+(BX)+(SI) PA=(DS) ×16+(BX)+(DI) PA=(SS) ×16+(BP)+(SI) PA=(SS) ×16+(BP)+(DI) PA=(DS)×16+(BX)+(SI) +位移量 PA=(DS)×16+(BX)+(DI)+位移量 PA=(SS)×16+(BP)+(SI) +位移量 PA=(SS)×16+(BP)+(DI)+位移量 基址寻址 变址寻址 基址变址寻址 基址变址相对寻址

2.指出下列8088指令的错误: (1) MOV AH, BX (2) MOV [BX], [SI] (3) MOV AX, [SI][DI]

(4) MOV MYDAT[BX][SI], ES:AX (5) MOV BL, 1000 (6) MOV CS, AX (7) MOV DS, BP (8) XLAT BX (9) IN AX, 0382H (10) OUT AX, 20H 答:(1 )两个操作数长度不一致

(2 )两个操作数不能都是存储器操作数

(3 )变址寻址方式不能使用两个变址寄存器 (4 )寄存器寻址没有段超越用法

(5 )两个操作数长度不一致(或 1000 超出字节数据范围) (6 )CS不能做目的寄存器

(7)段寄存器只能由通用寄存器对其操作,BP不能对通用寄存器进行操作 (8 )XLAT 中BX是隐含操作数

(9 )IN指令中16 位端口地址要用 DX作为操作数 (10)OUT指令两个操作数反了

3. 按要求编写下面的程序段

1) 利用移位指令计算DX=3×AX+7×BX,假设为无符号数运算,无

进位。

2) 用逻辑运算指令实现数字0~9的ASCII码与非压缩BCD码的互相

转换

3) 把DX.AX中的双字右移4位

4) 假设从4A00H:0000开始的4个字节中存放了4个非压缩的BCD

码,现在按照低地址对低位,高地址对高位的原则,将他们合并到DX中。

答:1)MOV CX, AX SHL AX, 1 ; AX*2 ADD AX, CX ; AX*3 MOV DX, BX MOV CL, 3

SHL DX, CL ; BX*8 SUB DX, BX ; BX*7 ADD DX, AX

2)MOV AL, ’0’

LOP: AND AL, 0FH INC AL

CMP AL, ‘:’ JNE LOP MOV AL, 0

LOP1: OR AL, 30H INC AL

CMP AL, 0AH JNE LOP1

3) MOV CL, 4 SHR AX,CL MOV BL, DL SHR DX, CL SHL BL, CL OR AH, BL

4)MOV AX, 4A00H MOV DS, AX MOV CL, 4 MOV SI, 0 MOV AL, [SI] AND AL, 0FH MOV DL, AL INC SI

MOV AL, [SI] SHL AL, CL OR DL, AL INC SI

MOV AL, [SI] AND AL, 0FH MOV DH, AL INC SI

MOV AL, [SI] SHL AL, CL OR DH, AL

4. 请说明下面两段程序的功能

1) mov si, 600h

mov di, 601h mov ax, ds mov es, ax mov cx, 256 std

rep movsb

2) cld

mov ax, 0fefh

mov cx, 5

mov bx, 3000h mov es, bx mov di, 2000h rep stosw

答:1 )从DS:600H 开始将向低地址方向的256 字节向高地址移动一个字节位置。

2 )从3000:2000h 开始连续存放 5 个0fefh

5. 假设DS=2000H. BX=1256H, SI=528FH, 位移量TABLE=20A1H,

[232F7H]=3280H, [264E5H]=2450H, 试问执行下列段内间接寻址的转移指令后,转移到有效地址是什么?

i. JMP BX ii. JMP TABLE[BX] iii. JMP [BX][SI]

答: (1)1256H (2)3280H (3)2450H

6. 判断下列程序段跳转到条件

(1) XOR AX, 1E1EH JE EQUAL

(2) TEST AL, 10000001B JNZ THERE (3) CMP CX, 64H JB THERE 答:(1) (AX)=1E1EH (2) (AL) 的最高位和/ 或最低位为1 (3) (CX)<64H

7. 如果条件跳转指令的跳转目标范围超出-128~127的范围,该如何处

理?举例说明。

答:可以把跳转条件做一些调整,利用无条件跳转的跳转范围大,来达到目的,如:

CMP AX, 33 JE LONG

?? ; 大于 127 字节 LONG: 改为:

CMP AX, 33

JNE SHOETER JMP LONG

SHORTER:??; 大于127 字节

?? LONG:

8. 按要求编写下面的程序段

1) 当DX高4位全为0时,使AX=0,否则AX=-1。

2) 已知字符串string包含有256BYTE的内容,将其中所有的‘$’符

号替换成空格(‘ ’)。

3) 所谓回文字符串是指一个字符串正读和倒读都是一样的,例如字符

串‘ABCDEFFEDCBA’就是一个回文字符串,而字符串‘ABCFDDCAB’就不是回文字符串。现在有一个字符串string,包含有16个字节的内容,请编写程序段,判断该字符串是否为回文字符串。

4) 统计以‘$’字符结束的字符串string的字符个数。 答: 1 )

TEST DX, 0F0H JZ OK1 XOR AX, AX JMP OK2

OK1:MOV AX, -1 Ok2: ? 2 )

MOV CX, 256 MOV AL, ‘$’ MOV AH, ‘ ’ LEA BX, string

LP: CMP [BX], AL JNZ NEXT MOV [BX], AH NEXT:INC BX DEC CX JNZ LP

3)

LEA SI,string MOV DI, 15 ADD DI, SI

LP: MOV AL, [SI] CMP AL, [DI]

JNZ NO ; 不是回文 INC SI DEC DI CMP SI, DI JB LP

?? ; 是回文 NO:?? ; 不是回文 4)

MOV CX,0 ;放字符个数 LEA SI, string LP: MOV AL, [SI] CMP AL, ’$’ JE EXIT INC SI INC CX JMP LP EXIT:

9. 设置CX=0,则LOOP指令将执行多少次?例如:

mov cx, 0 delay: loop delay 答:将执行65536 次

10. 在下面程序段的括号中如果分别放上下面的指令

(1) LOOP L20 (2) LOOPNE L20 (3) LOOPE L20

试说明,当程序执行完时 AX, BX, CX, DX四个寄存器的内容分别是什么?

MOV AX, 01

MOV BX, 02 MOV CX, 03 MOV DX, 04 L20: INC AX

ADD BX, AX SHR DX, 1 ( ) RET 答:

(1 ) (AX)=4, (BX)=11, (CX)=0, (DX)=0 (2 ) (AX)=4, (BX)=11, (CX)=0, (DX)=0 (3 ) (AX)=2, (BX)=4, (CX)=2, (DX)=2

11. 下面两条短转移指令的转移地址A10和A20分别是多少?(用16进制

来表示)

(1) 0110 EB F7 JMP A10 (2) 0110 EB 09 JMP A20 指令地址(16进制) 指令码 汇编语句 答: (1 )A10=0109H (2 )A20=011BH

12. 按要求编写下面的程序段

1) 将ELEMS中的100个字节数据的位置颠倒过来(即第一个字节和

第100个字节的内容交换,第二个字节和第99个字节的内容交换??)。

2) 有两个3位的ASCII码字串ASC1和ASC2定义如下:

ASC1 DB ‘578’ ASC2 DB ‘694’ ASC3 DB ‘0000’

请编写计算ASC3=ASC1+ASC2的程序段。

3) 编写四字节ASCII码串‘3785’与ASCII数码‘5’相乘的程序段。 答:1 )

LEA SI, ELEMS MOV DI, SI ADD DI, 99 MOV CX,50

LP : MOV AL, [SI] XCHG AL, [DI] XCHG AL, [SI] INC SI

DEC DI DEC CX JNZ LP 2)

CLC ; 清CF PUSHF

LEA SI,ASC1+2 ; 从个位开始加,DB '578' 等同于DB '5','7','8' LEA DI,ASC2+2 LEA BX,ASC3+3

MOV CX,3 ; 计算的数有位 A20: MOV AH,0

MOV AL,[SI]

SUB AL,30H; ; ASCII码转BCD码 MOV DL,[DI]

SUB DL,30H ; ASCII 码转BCD码 POPF

ADC AL,DL

AAA ; 非压缩 BCD码加法调整 PUSHF

ADD AL,30H ; BCD 码转ASCII 码 MOV [BX],AL DEC SI DEC DI DEC BX LOOP A20 POPF

ADD AH,30H MOV [BX],AH 3)

MOV CX,4

LEA SI,MULCND+3 LEA DI,PRODUCT+4

AND MULPLR,0FH ; ASCII码转BCD码 A30: MOV AL,[SI]

AND AL,0FH ; ASCII码转 BCD码 MUL MULPLR

AAM ; BCD码乘调整

ADD AL,[DI]

AAA ; BCD码加法调整 OR AL,30H MOV [DI],AL DEC DI

MOV [DI],AH DEC SI LOOP A30

OR BYTE PTR [DI],30H

13. 请编写完整程序在一个升序字节数组中查找数N,找到后将此数从数

组中删除,并使得CF=0;没找到返回CF=1。数组的首地址和末地址为A_HEAD和A_END。 答:

DATA SEGMENT PARA 'DATA' A_HEAD DW ?

BUFF DB 1,2,3,4,5,6,7,8,9,0 COUNT EQU $-BUFF A_END DW ? N DB 4 DATA ENDS

CODE SEGMENT PARA 'CODE'

ASSUME CS:CODE, DS: DATA START: MOV AX,DATA MOV DS,AX MOV SI,OFFSET BUFF MOV A_HEAD,SI MOV AL,COUNT CBW

ADD AX,SI MOV DI,AX DEC DI

MOV A_END,DI MOV AL,N

LP: CMP AL,[SI] JNE NEXT JMP DEL

NEXT: INC SI ;考察下一个数据 CMP SI,DI

JBE LP ; 循环 STC ;CF<-1 JMP EXIT

DEL: CLC ;CF<-0 CMP SI,DI

JNE DELDATA

DEC A_END ; 删除的是最后一个元素 JMP EXIT

DELDATA:MOV CX,DI SUB CX,SI

LP2: MOV AL,[SI+1] ; 该循环将SI+1 到DI位置的数据移动到 SI 到DI-1 的位置

MOV [SI],AL INC SI LOOP LP2

DEC A_END ; 调整结尾指针 EXIT: MOV AH,4CH INT 21H CODE ENDS END START

14. 请编写完整程序从键盘读取字符,如果是十进制的‘0’~‘9’则在

屏幕上输出该数的8位二进制码,并将数字依次存放到BUF开头的数组中,如果读入的字符是’Q’或者‘q’,则程序退出,其他情况在屏幕上打印“You must input 0~9, or ‘q’ or ‘Q’”。 (如输入的字符是‘9’,则输出“00001001”)

提示:语句“You must input 0~9, or ‘q’ or ‘Q’”定义成以’$’结尾的字符串,键盘输入和屏幕输出,请参看教材后的DOS功能调用(int 21h)的相关功能。

输出一个数的2进制形式应该从最高位开始输出,可以将此段程序定义成一个过程。

答: ;'\。 DATA SEGMENT PARA 'DATA'

sentence db 'You must input 0~9, or \ buf db 20 dup(?) DATA ENDS

CODE SEGMENT PARA 'CODE'

ASSUME CS:CODE, DS: DATA

MAIN PROC FAR PUSH DS MOV AX,0 PUSH AX

MOV AX,DATA MOV DS,AX MOV SI,0

DOIT: MOV AH,1 INT 21H CMP AL,'Q' JNE NEXT JMP EXIT

NEXT: CMP AL,'q' JNE NEXT1 JMP EXIT

NEXT1: SUB AL,30H JC PRINT JMP NEXT2

PRINT: MOV AH,9 LEA DX,SENTENCE INT 21H CALL CRLF JMP DOIT

NEXT2: CMP AL,9 JG PRINT MOV CX,8 CALL CRLF

PRNDATA:SHL AL,1 JC IS1 MOV DL,'0' JMP OUTBIN IS1: MOV DL,'1' OUTBIN: PUSH AX MOV AH,2 INT 21H POP AX

LOOP PRNDATA CALL CRLF JMP DOIT

EXIT: RET

MAIN ENDP

CRLF PROC NEAR ;回车换行 PUSH AX PUSH DX

MOV DL, 0DH ;回车 MOV AH, 2

INT 21H ; 输出DL中的字符 MOV DL, 0AH ; 换行 MOV AH, 2

INT 21H ; 输出DL中的字符 POP DX POP AX RET CRLF ENDP CODE ENDS END MAIN

本文来源:https://www.bwwdw.com/article/hjg5.html

Top