第4章?匯編語(yǔ)言程序設(shè)計(jì)?習(xí)題答案(部分)
4.1 什么是標(biāo)號(hào)?它有哪些屬性?
答:標(biāo)號(hào)是一種特殊的標(biāo)識(shí)符,它代表代碼段中的某個(gè)具體位置,它主要用于表明
轉(zhuǎn)移的目標(biāo)位置。源程序中的標(biāo)號(hào)都有三種屬性:段、偏移及類(lèi)型。
4.2 什么是變量?它有哪些屬性?
答:變量名代表存儲(chǔ)器中的一個(gè)數(shù)據(jù)區(qū)的名字。源程序中的變量有五種屬性:段、偏
移、類(lèi)型、長(zhǎng)度、規(guī)模。
4.3 什么是偽指令?什么是宏指令?偽指令在什么時(shí)候被執(zhí)行?宏指令在程序中如何
被調(diào)用?
答:偽指令語(yǔ)句是一種不產(chǎn)生目標(biāo)代碼的語(yǔ)句,它僅僅在匯編過(guò)程中告訴匯編程序應(yīng)
如何匯編。偽指令語(yǔ)句是在匯編程序?qū)υ闯绦騾R編期間由匯編程序處理的操作。
宏是若干語(yǔ)句組成的程序段,宏指令語(yǔ)句用來(lái)定義宏。一旦把某程序段定義成宏,則可
以用宏名代替那段程序。在匯編時(shí),要對(duì)宏進(jìn)行宏展開(kāi),展開(kāi)的過(guò)程是將宏名用程序段代替。
4.4 匯編語(yǔ)言表達(dá)式中有哪些運(yùn)算符?它們所完成的運(yùn)算是在什么時(shí)候進(jìn)行的?
答:匯編語(yǔ)言表達(dá)式中的運(yùn)算符有:
算術(shù)運(yùn)算符?+、-、*、/、MOD
邏輯運(yùn)算符?AND、OR、NOT、XOR
關(guān)系運(yùn)算符?EQ、NE、LT、GT、LT、LE、GE
分析運(yùn)算符?SEG、OFFSET、TYPE、LENGTH、SIZE
屬性運(yùn)算符?PTR、THIS、SHORT
其?它?LOW、HIGH
這些運(yùn)算符都是在在匯編時(shí)由匯編程序?qū)ζ溥\(yùn)算的。
4.5 畫(huà)出下列語(yǔ)句中的數(shù)據(jù)在存儲(chǔ)器中的存儲(chǔ)情況。
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 按下列要求,寫(xiě)出各數(shù)據(jù)定義語(yǔ)句。
DB1 為10H 個(gè)重復(fù)的字節(jié)數(shù)據(jù)序列:1,2,5 個(gè)3,4。
DB2 為字符串‘STUDENTS’
DB3 為十六進(jìn)制數(shù)序列:12H,ABCDH
用等值語(yǔ)句給符號(hào)COUNT 賦以DB1 數(shù)據(jù)區(qū)所占字節(jié)數(shù),該語(yǔ)句寫(xiě)在最后。
解答:
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 中兩個(gè)OR 有什么差別?這兩個(gè)操作數(shù)分別在什么時(shí)
候執(zhí)行?
解答:(1)指令OR AX,1234H OR 0FFH 中的第一個(gè)OR 是指令系統(tǒng)中的“或”指令,而
第二個(gè)OR 是表達(dá)式中表示邏輯“或”關(guān)系的。(2)指令OR AX,1234H OR 0FFH 中的第一個(gè)
OR 是在CPU 執(zhí)行指令操作時(shí)才會(huì)執(zhí)行。而第二個(gè)OR 是在匯編時(shí)就會(huì)將1234H 和0FFH 作
邏輯“或”運(yùn)算,得到結(jié)果12FFH。然后執(zhí)行第一個(gè)OR 指令,完成AX 的內(nèi)容與12FFH 的
邏輯“或”運(yùn)算。
4.8 對(duì)于下面的數(shù)據(jù)定義,各條MOV 指令單獨(dú)執(zhí)行后,有關(guān)寄存器的內(nèi)容是什么?
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 設(shè)數(shù)據(jù)段DSEG 中符號(hào)及數(shù)據(jù)定義如下,試寫(xiě)出數(shù)據(jù)在內(nèi)存中的存儲(chǔ)示意圖。
(數(shù)據(jù)段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 單元開(kāi)始存放有一個(gè)字符串(以字符‘$’結(jié)束),試完成:
(1)編程統(tǒng)計(jì)該字符串長(zhǎng)度(不包含?$ 字符,并假設(shè)長(zhǎng)度為兩字節(jié))。
(2)把字符串長(zhǎng)度放在STRING 單元,把整個(gè)字符串往下移兩個(gè)單元。
程序段為:
(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”。
解答程序?yàn)椋?/span>
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?試編寫(xiě)一個(gè)匯編語(yǔ)言程序,要求對(duì)鍵盤(pán)輸入的小寫(xiě)字母用大寫(xiě)字母顯示出來(lái)。
解答程序?yàn)椋?/span>
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' ;比較,判斷是否小寫(xiě)字母
ja error1
cmp al,'a'
jb error1 ;大寫(xiě)字母重新輸入
sub al,20H ;減20H 轉(zhuǎn)換為大寫(xiě)字母
mov dl,al
mov ah,02h
int 21h
mov ax,4c00h
int 21h
code ends
end start
4.16?鍵盤(pán)輸入十個(gè)學(xué)生的成績(jī),試編制一個(gè)程序統(tǒng)計(jì)69~69 分,70~79 分,80~89 分,
90~99 分及100 分的人數(shù),分別存放到S6,S7,S8,S9 及S10 單元中。
解答程序?yàn)椋?/span>
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