汇编语言程序设计
1.假设下列指令中的所有标识符均为类型属性为字的变量,请指出下列哪些指令是非法的?它们的错误是什么?
(1) MOV BP, AL;
(2) MOV WORD_OP [BX+4*3][DI], SP
(3) MOV WORD_OP1, WORD_OP2;
(4) MOV AX, WORD_OP1[DX];
(5) MOV SAVE_WORD, DS
(6) MOV SP, SS:DATA_WORD [BX][SI]
(7) MOV [BX][SI], 2;
(8) MOV AX, WORD_OP1+WORD_OP2
(9) MOV AX, WORD_OP1-WORD_OP2+100
(10) MOV WORD_OP1, WORD_OP1-WORD_OP2
答:
假设下列指令中的所有标识符均为类型属性为字的变量,请指出下列哪些指令是非法的?它们的错误是什么?
(1) MOV BP, AL;错,寄存器类型不匹配
(2) MOV WORD_OP [BX+4*3][DI], SP
(3) MOV WORD_OP1, WORD_OP2;错,不能都是存储器操作数
(4) MOV AX, WORD_OP1[DX];错,DX不能用于存储器寻址
(5) MOV SAVE_WORD, DS
(6) MOV SP, SS:DATA_WORD [BX][SI]
(7) MOV [BX][SI], 2;错,[BX][SI]未指出数据类型
(8) MOV AX, WORD_OP1+WORD_OP2
(9) MOV AX, WORD_OP1-WORD_OP2+100
(10) MOV WORD_OP1, WORD_OP1-WORD_OP2
2.假设VAR1和VAR2为字变量,LAB为标号,试指出下列指令的错误之处:
(1) ADD VAR1, VAR2;
(2) SUB AL, VAR1;
(3) JMP LAB [SI];
(4) JNZ VAR1;
(5) JMP NEAR LAB;
答:
假设VAR1和VAR2为字变量,LAB为标号,试指出下列指令的错误之处:
(1) ADD VAR1, VAR2;不能都是存储器操作数
(2) SUB AL, VAR1;数据类型不匹配
(3) JMP LAB [SI];LAB是标号而不是变量名,后面不能加[SI]
(4) JNZ VAR1;VAR1是变量而不是标号
(5) JMP NEAR LAB;应使用NEAR PTR
3.有符号定义语句如下:BUFF DB 1, 2, 3, ‘123’
EBUFF DB 0
L EQU EBUFF - BUFF
问L的值是多少?
答:L=6。
4.假设程序中的数据定义如下:LNAME DB 30 DUP (?)
ADDRESS DB 30 DUP (?)
CITY DB 15 DUP (?)
CODE_LIST DB 1, 7, 8, 3, 2
(1)用一条MOV指令将LNAME的偏移地址放入AX。
(2)用一条指令将CODE_LIST的头两个字节的内容放入SI。
(3)用一条伪操作使CODE_LENGTH的值等于CODE_LIST域的实际长度。
答:
(1) MOV AX, OFFSET LNAME
(2) MOV SI, WORD PTR CODE_LIST
(3) CODE_LENGTH EQU
5.试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来。
答:
程序段如下:
BEGIN: MOV AH, 1;从键盘输入一个字符的DOS调用
INT 21H
CMP AL,‘a’ ;输入字符<‘a’吗?
JB STOP
CMP AL,‘z’ ;输入字符>‘z’吗?
JA STOP
SUB AL, 20H;转换为大写字母,用AND AL, 1101 1111B也可
MOV DL, AL;显示一个字符的DOS调用
MOV AH, 2
INT 21H
JMP BEGIN
STOP: RET
6.编写程序,从键盘接收一个小写字母,然后出它的前导字符和后续字符,再按顺序显示这三个字符。
答:
程序段如下:
BEGIN: MOV AH, 1;从键盘输入一个字符的DOS调用
INT 21H
CMP AL,‘a’ ;输入字符<‘a’吗?
JB STOP
CMP AL,‘z’ ;输入字符>‘z’吗?
JA STOP
DEC AL;得到前导字符
MOV DL, AL;准备显示三个字符
MOV CX, 3
DISPLAY: MOV AH, 2;显示一个字符的DOS调用
INT 21H
INC DL
LOOP DISPLAY
STOP: RET
7.下面的程序段有错吗?若有,请指出错误。
CRAY PROC
PUSH AX
ADD AX, BX
RET
ENDP CRAY
答:
程序有错。改正如下:
CRAY PROC
ADD AX, BX
RET
CRAY ENDP;CRAY是过程名,应放在ENDP的前面
8.写一段子程序SKIPLINES,完成输出空行的功能。空出的行数在AX寄存器中。
答:
程序如下:
CSEG SEGMENT
SKIPLINES PROC FAR
ASSUME CS: CSEG
BEGIN: PUSH CX
PUSH DX
MOV CX, AX
DISP: MOV DL, 0DH;显示回车换行,即输出空行
MOV AH, 2;显示一个字符的DOS调用
INT 21H
MOV DL, 0AH
MOV AH, 2;显示一个字符的DOS调用
INT 21H
LOOP DISP
POP DX
POP CX
RET
SKIPLINES ENDP
END
9.编写一条宏指令CLRB,完成用空格符将一字符区中的字符取代的工作。字符区首地址及其长度为变元。
答:
宏定义如下:
CLRB MACRO N, CFIL
MOV CX, N
CLD
MOV AL,‘ ’ ;;取空格符的ASCII码
LEA DI, CFIL
REP STOSB
ENDM
10.写出分配给下列中断类型号在中断向量表中的物理地址。
(1) INT 12H (2) INT 8
答:
(1)中断类型号12H在中断向量表中的物理地址为00048H、00049H、0004AH、0004BH;
(2)中断类型号8在中断向量表中的物理地址为00020H、00021H、00022H、00023H。
汇编语言大小写字母转换
11.用CALL指令来模拟实现INT 21H显示字符T的功能。
答:
MOV AH, 2
MOV DL, ‘T’
PUSH DS
PUSHF;因中断服务程序的返回指令是IRET,而不是RET
MOV BX, 0
MOV DS, BX
CALL DWORD PTR[21H*4];用CALL指令调用21H的中断服务程序
POP DS
12.写出指令将一个字数据从端口1000H输入。
答:
指令为: MOV DX, 1000H
IN AX, DX
13.写出文件代号式磁盘存取操作的错误代码:
(1)非法文件代号 (2)路径未发现 (3)写保护磁盘
答:
错误代码为:
(1) 06 (2) 03 (4) 19
14.8088/8086CPU的存储器采用分段方式管理,每个段最多可以有___ ___字节,全部存储空间可以分成______个这样大小且互相不重叠的段。
答:64K16
15.已知[X-Y]补=7001H,[X+Y]补=0001H,则[2X]补= H。
答:7002H