第4章 汇编语言程序设计 习题答案(部分)
4.1 什么是标号?它有哪些属性?
答:标号是一种特殊的标识符,它代表代码段中的某个具体位置,它主要用于表明
转移的目标位置。源程序中的标号都有三种属性:段、偏移及类型。
4.2 什么是变量?它有哪些属性?
答:变量名代表存储器中的一个数据区的名字。源程序中的变量有五种属性:段、偏
移、类型、长度、规模。
4.3 什么是伪指令?什么是宏指令?伪指令在什么时候被执行?宏指令在程序中如何
被调用?
答:伪指令语句是一种不产生目标代码的语句,它仅仅在汇编过程中告诉汇编程序应
如何汇编。伪指令语句是在汇编程序对源程序汇编期间由汇编程序处理的操作。
宏是若干语句组成的程序段,宏指令语句用来定义宏。一旦把某程序段定义成宏,则可
以用宏名代替那段程序。在汇编时,要对宏进行宏展开,展开的过程是将宏名用程序段代替。
4.4 汇编语言表达式中有哪些运算符?它们所完成的运算是在什么时候进行的?
答:汇编语言表达式中的运算符有:
算术运算符 +、-、*、/、MOD
逻辑运算符 AND、OR、NOT、XOR
关系运算符 EQ、NE、LT、GT、LT、LE、GE
分析运算符 SEG、OFFSET、TYPE、LENGTH、SIZE
属性运算符 PTR、THIS、SHORT
其 它 LOW、HIGH
这些运算符都是在在汇编时由汇编程序对其运算的。
4.5 画出下列语句中的数据在存储器中的存储情况。
ORG 100H
VARB DB 34,34H,‘GOOD’,2 DUP(1,2 DUP(0))
VARW DW 5678H,‘CD’,$+2,2 DUP(100)
VARC EQU 12
VARB DS:0100H 22H DS:010BH 00H
DS:0101H 34H VARW DS:010CH 78H
DS:0102H 47H DS:010DH 56H
DS:0103H 4FH DS:010EH 44H
DS:0104H 4FH DS:010FH 43H
DS:0105H 44H DS:0110H 12H
DS:0106H 01H DS:0111H 01H
DS:0107H 00H DS:0112H 64H
DS:0108H 00H DS:0113H 00H
DS:0109H 01H DS:0114H 64H
DS:010AH 00H DS:0115H 00H
4.6 按下列要求,写出各数据定义语句。
DB1 为10H 个重复的字节数据序列:1,2,5 个3,4。
DB2 为字符串‘STUDENTS’
DB3 为十六进制数序列:12H,ABCDH
用等值语句给符号COUNT 赋以DB1 数据区所占字节数,该语句写在最后。
解答:
DB1 DB 16 DUP(1,2,5 DUP(3),4)
DB2 DB ‘STUDENTS’
DB3 DW 12H,0ABCDH
COUNT EQU DB2-DB1
4.7 指令OR AX,1234H OR 0FFH 中两个OR 有什么差别?这两个操作数分别在什么时
候执行?
解答:(1)指令OR AX,1234H OR 0FFH 中的第一个OR 是指令系统中的“或”指令,而
第二个OR 是表达式中表示逻辑“或”关系的。(2)指令OR AX,1234H OR 0FFH 中的第一个
OR 是在CPU 执行指令操作时才会执行。而第二个OR 是在汇编时就会将1234H 和0FFH 作
逻辑“或”运算,得到结果12FFH。然后执行第一个OR 指令,完成AX 的内容与12FFH 的
逻辑“或”运算。
4.8 对于下面的数据定义,各条MOV 指令单独执行后,有关寄存器的内容是什么?
PREP DB ?
TABA DW 5 DUP(?)
TABB DB ‘NEXT’
TABC DD 12345678H
(1)MOV AX,TYPE PREP ;AX=1
(2)MOV AX,TYPE TABA ;AX=2
(3)MOV AX,LENGTH TABA ;AX=5
(4)MOV AX,SIZE TABA ;AX=10
(5)MOV AX,LENGTH TABB ;AX=1
(6)MOV DX,SIZE TABC ;AX=4
4.9 设数据段DSEG 中符号及数据定义如下,试写出数据在内存中的存储示意图。
(数据段DSEG 定义略)
解答:
DAB DS:0100H 2FH DS:0113H
DS:0101H 47H DS:0114H
DS:0102H 4FH DS:0115H
DS:0103H 54H DS:0116H
DS:0104H 4FH DS:0117H
DS:0105H 2FH DS:0118H
DS:0106H 0DH DS:0119H
DS:0107H 0AH DS:011AH
DBB DS:0108H 05H DS:011BH
DS:0109H 13H DDW DS:011CH 32H
DS:010AH 61H DS:011DH 31H
CCB DS:010BH DS:011EH 64H
DS:010CH DS:011FH 00H
DS:010DH DS:0120H 33H
DS:010EH DS:0121H 03H
DS:010FH DS:0122H 78H
DS:0110H DS:0123H 00H
DS:0111H DS:0124H 64H
DS:0112H DS:0125H 00H
4.10 若自STRING 单元开始存放有一个字符串(以字符‘$’结束),试完成:
(1)编程统计该字符串长度(不包含 $ 字符,并假设长度为两字节)。
(2)把字符串长度放在STRING 单元,把整个字符串往下移两个单元。
程序段为:
(1)
MOV SI, OFFSET STRING
XOR BX, BX
CONT:MOV AL, [SI]
CMP AL, ‘$’
JZ NEXT
INC BX
INC SI
JMP CONT
NEXT:MOV AH, 4CH
INT 21H
(2)STRING DB ‘ $’
COUNT EQU $-STRING
MOV SI, OFFSET STRING
MOV CX, COUNT
ADD SI, CX
CONT: DEC SI
MOV AL, [SI]
MOV [SI+2], AL
LOOP CONT
MOV CX, COUNT
MOV STRING, CX
MOV AH, 4CH
INT 21H
4.11 将字符串STRING 中的‘&’字符用空格代替,字符串STRING“It is FEB&03”。
解答程序为:
DATA SEGMENT
STRING DB ‘It is FEB&03’
COUNT EQU $-STRING
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV SI,OFFSET STRING
MOV CX,COUNT
MOV AL,‘$’
CONT:CMP AL,[SI]
JNZ NEXT
MOV BYTE PTR[SI],‘ ’
NEXT: INC SI
LOOP CONT
MOV AH,4CH
INT 21H
CODE ENDS
END START
4.15 试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来。
解答程序为:
data segment
message db 'please enter the small letter:',0ah,0dh,'$'
message2 db 'the capital letter is:',0ah,0dh,'$'
error db 'enter must be small!please enter again:',0ah,0dh,'$'
message3 db 'the capital letter is:','$'
letter db ?
data ends
stack segment
db 100h dup(?)
stack ends
code segment
assume cs:code,ds:data,ss:stack
start:mov ax,data
mov ds,ax
jmp l1
xor ax,ax
error1:lea dx,error
mov ah,09h
int 21h
l1:lea dx,message
mov ah,09h
int 21h
lea dx,letter
mov ah,01h
int 21h
push ax
mov dl,0ah
mov ah,02h
int 21h
mov dl,0dh
int 21h
lea dx,message3
mov ah,09h
int 21h
pop ax
cmp al,'z' ;比较,判断是否小写字母
ja error1
cmp al,'a'
jb error1 ;大写字母重新输入
sub al,20H ;减20H 转换为大写字母
mov dl,al
mov ah,02h
int 21h
mov ax,4c00h
int 21h
code ends
end start
4.16 键盘输入十个学生的成绩,试编制一个程序统计69~69 分,70~79 分,80~89 分,
90~99 分及100 分的人数,分别存放到S6,S7,S8,S9 及S10 单元中。
解答程序为:
DATA SEGMENT
BUF DB 10 DUP(?)
S6 DB ?
S7 DB ?
S8 DB ?
S9 DB ?
S10 DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV SI,OFFSET S6
XOR AL,AL
MOV CX,0504H
CONT: MOV [SI],AL
INC SI
LOOP CONT
MOV CX,10
MOV SI,OFFSET BUF
CONT1: MOV AH,1
INT 21H
SHL AL,CL
MOV BL,AL
MOV AH,1
INT 21H
SUB AL,30H
OR AL,BL
MOV [SI],AL
CMP AL,70H
JAE NEXT1
INC BYTE PTR S6
NEXT1: CMP AL,80H
JAE NEXT2
INC BYTE PTR S7
NEXT2: CMP AL,90H
JAE NEXT3
INC BYTE PTR S8
NEXT3: CMP AL,99H
JA NEXT4
INC BYTE PTR S9
JMP NEXT5
NEXT4: INC BYTE PTR S10
NEXT5: INC SI
LOOP CONT1
MOV AH,4CH
INT 21H
CODE ENDS
END START