自測題
1 程序在數(shù)據(jù)段中定義的數(shù)組如下:
NAMES DB 'TOM.',20
DB 'ROSE.',30
DB 'KATE.',25
請指出下列指令是否正確,為什么?
(1) MOV BX,OFFSET NAMES
MOV AL,[BX+5]
(2) MOV AX,NAMES
(3) MOV AX,WORD PTR NAMES+1
(4) MOV AX,NAMES[BX][SI]
(5) MOV AX,OFFSET NAMES[BX][SI]
INC [AX]
(6) LEA DI,NAMES[BX][SI]
MOV AL,[DI]
答案
(1) 兩條指令都合法。
(2) 這條指令不正確,因為NAMES的屬性為字節(jié),二目的寄存器是AX,所以類型不匹配。
(3) 為合法指令。指令中講已定義的字節(jié)變量用偽操作PTR改變?yōu)樽诸愋?,所以避免了類型不匹配?br />
(4) 這條指令不正確,源操作數(shù)的數(shù)據(jù)類型偽字節(jié)型,目的操作數(shù)偽字類型,所以類型不匹配。
(5) 這條指令不正確,因為在匯編過程中,OFFSET操作將得到變量的便移值,但對相對基址變址尋址方式形成的值在匯編指令時還是未知的;在第二條指令中,AX不能作為基址寄存器用。
(6) 為合法指令。
2 假設程序中的數(shù)據(jù)定義如下:
PARTNO DW?
PNAME DB 16 DUP(?)
COUNT DD ?
PLENTH EQU $-PARTNO
問PLENTH的值為多少?它標是什么意義?
答案
PLENTH的值為22,它表示從當前位置到PAERNO處所占的字節(jié)。
3 若WORD1及WORD2均為字變量,ADDITON為標號.請說明下列指令的錯誤之處:
(1) JMP ADDITION[DI]
(2) JNZ WORD2
(3) JMP FAR ADDITION
答案
(1) 其錯在于兩個地址表達式不能相加;
(2) 其錯在于條件轉移指令只能進行8位的相對尋址,而WORD2確是一個字變量;
(3) 應該為:JMP FAR PTR ADDITION;
4 下面兩個語句有何區(qū)別:
X1 EQU 1000H
X2=1000H
答案
X1不能多次賦值,X2能多次賦值。
5 對于下面的數(shù)據(jù)定義,各條MOV指令單獨執(zhí)行后,有關寄存器的內容是什么?
FLDB DB ?
TABLEA DB 10 DUP(?)
TABLEB DB 'ABCD'
(1) MOV AX,TYPE FLDB
(2) MOV AX,TYPE TABLEA
(3) MOV CX,LENGTH TABLEA
(4) MOV DX,SIZE TABLEA
(5) MOV CX,LENGTH TABLEB
答案
(1) AX=1 (2) AX=1 (3) CX=10 (4) DX=10 (5) CX=1
6 已知堆棧段寄存器SS的內容是0F0A0H,堆棧指示器SP的內容是00B0H,先執(zhí)行兩條PUSH指令把8057H和0F79H入棧,然后執(zhí)行一條POP指令,試畫出示意圖,說明堆棧及SP內容的變化過程.
答案
見圖答4.6

7 試設計一個數(shù)據(jù)段DSEG,定義下列字符變量或數(shù)據(jù)變量.請畫出(1)~(5)題的內存分配圖,并指明它們的初值。
(1) FIRST為十六進制數(shù)的字變量4020H;
(2) SECOND為二進制數(shù)的字節(jié)變量01011100B;
(3) THIRD為二進制數(shù)的字節(jié)變量64;
(4) STRING為字符串變量ADDITION;
(5) ASCDATA為ASCII數(shù)字變量‘46782';
(6) TABL為10個字的數(shù)組變量;
(7) REPDATA位數(shù)字0,2,3,0,6重復5次的字節(jié)變量;
(8) ZESULT為10個0的字節(jié)變量。
答案
數(shù)據(jù)段DSEG定義如下:
DSEG SEGMENT
FIRST DW 4020H
SECOND DB 0101100B
THIRD DB 64D
STRING DB ‘ADDITION’
ASCDATA DB ‘46782’
TABL DW 10 DUP(?)
REPDATA DB 5 DUP(0,2,3,0,6)
RESULT DB 10 DUP(0)
內存分配情況:
0100: 0000H 20H FIRST
40H
0002H 01011100B SECOND
0003H 64D THIRD
0004H 41H STRING
0005H 44H
0006H 44H
0007H 49H
0008H 54H
0009H 49H
000AH 4FH
OOOBH 4EH
000CH 34H ASCDATA
000DH 36H
000EH 37H
000FH 38H
0010H 32H
8 設有3個字變量的變量名及其內容如下:
VAR1 3C46H
VAR2 F678H
VAR3 0059H
試設計一個數(shù)據(jù)段定義這三個變量及其地址表變量ADDRTABL(包括段地址和偏移地址)。
答案
DATA SEGMENT
VAR1 DW 3C46H
VAR2 DW F678H
VAR3 DW 0059H
ADDRTABL DD VAR1
DD VAR2
DD VAR3
DATA ENDS
9 設有一個有符號數(shù)數(shù)組,共有M個字。試編一程序求其種最大的數(shù);若需求絕對值最大的數(shù),程序如何修改?又若數(shù)組元素為無符號數(shù),求最大數(shù)的程序應如何修改?
答案
DSEG SEGMENT
DATA DW M DUP(?)
MAX DW ?
DSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG
START:MOV AX,DSEG
MOV DS,AX
MOV MAX,DATA
CLD
MOV SI,OFFSET DATA
MOV CX,M
L1:LODSW
CMP AX,MAX
JNG LAB
MOV MAX,AX
LAB:LOOP L1
MOV AH,4CH
INT 21H
CSEG ENDP
END START
若需要絕對值最大的數(shù),則就需要將每個數(shù)最大絕對值求出后再比較,要在LODSB語句插入下面程序:
AND AX,AX
JNS LAB1
NEG AX
LAB1:CMP AX,MAX
且在程序初始化MAX的值時應送入0(最小的絕對值).
若要對無符號數(shù)求最大值,則只需改變判別條件,即將
CMP AX,MAX 改為:CMP AX,MAX
JNG LAB JBE LAB
10 試編寫一程序統(tǒng)計一個字中的“1”的個數(shù)。
答案
|
STACK SEGMENT STACK DW 256 DUP(?) TOP LABEL WORD STACK ENDS DATA SEGMENT TW DB 1234H TWIS DW ? DATA ENDS CODE1 SEGMENT ASSUME CS:CODE1,DS:DATA,SS:STACK START:MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV SP,OFFSET TOP MOV AX,TW CALL FAR PTR BCNT1;調BCNT1子程序 PUSH BX MOV AL,AH CALL FAR PTR BCNT1 |
POP AX ADD AX,BX MOV TWIS,AX MOV AH,4CH INT 21H CODE1 ENDS CODE2 SEGMENT ASSUME CS:CODE2 BCNT1 PROC FAR MOV BX,0 MOV SI,0 BLOOP1:RCL AL,1 JNC BLOOP2 INC BX BLOOP2:INC SI CMP SI,8 RET BCNT1 ENDP CODE2 ENDS END START |
|
|
|
11 在首地址為DATA的字數(shù)組中存放了100H個補碼數(shù)。試編寫一個匯編語言程序,求出它們的平均值,放在AX寄存器中;同時求除數(shù)組中有多少個數(shù)小于此值,將結果放在BL中。
答案
CODE SEGMENT
ASSUME CS:CODE,DS:CODE
START:MOV AX,CODE
MOV DS,AX
MOV SI,OFFSET DATA
MOV AX,0
MOV DX,0
CLC
LP:ADD AX,[SI]]
INC SI
INC SI
ADC DX,0
LOOP LP
MOV AX,DX
MOV CX,100H
MOV SI,OFFSET DATA
MOV BL,0
LP1:CMP [SI],AX
JGE GRT
INC BL
GRT:INC SI
INC SI
LOOP LP1
DATA DW 100 DUP(?)
CODE ENDS
END START
12 已知32為數(shù)存放在DX:AX中。試編寫一個匯編語言程序將32為數(shù)左移4位,并將高4位存入CH中。
答案
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG
START:MOV CH,DH
MOV CL,4
SHR CH,CL
L1:SHL AX,1
RCL DX,1
LOOP L1
MOV AH,4CH
INT 21H
CSEG ENDS
END START
13 AX寄存器中存放著4位十六進制數(shù)。試編寫一個匯編語言程序,將這4位十六進制數(shù)分別轉換為相應的ASCII碼,并依次存放到RESULT數(shù)組的4個字節(jié)中去,要求用調用子程序的方法實現(xiàn)。
答案
CODE SEGMENT
ASSUME CS:CODE,DS:CODE
START:MOV BX,CODE
MOV DS,BX
MOV CL,4
MOV BL,4
MOV SI,OFFSET RESULT
LP:CALL HASC
MOV [SI],DL
INC SI
SHR AX,CL
DEC BL
JNZ LP
EXIT:MOV AH,4CH
INT 21H
HASC PROC NEAR
MOV DL,AL
AND DL,0FH
CMP DL,9
JA L2
ADD DL,30H
L1:RET
L2:ADD DL,37H
JMP L1
HASC ENDP
RESULT DB 4 DUP(?)
CODE ENDS
END START
14 設有兩個等字長字節(jié)型字符串。試編寫一個匯編語言子程序,比較它們是否完全相同;若相同,則將字幅“Y”送入AL中,否則,將字符“N”送入AL中。
答案
CODE SEGMENT
ASSUME CS:CODE,DS:CODE
START:MOV AX,CODE
MOV DS,AX
CMPS STRING1,STRING2
JNZ NE
MOV AL,‘Y’
JMP EXIT
NE:MOV AL,‘N’
EXIT:MOV AH,4CH
INT 21H
STRING1 DB ‘...’
STRING2 DB ‘...’
CODE ENDS
END START
15 輕編寫一程序,從附加段中一個未排序的字數(shù)組UNORDLST中,找出最大數(shù)和最小數(shù),分別放在AL和BX寄存器中。
答案
ESEG SEGMENT
UNORDLST DW 50 DUP(?)
COUNT EQU ($-UNORDLST)/2
ESEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,ES:ESEG
START:MOV AX,ESEG
MOV ESD,AX
MOV CX,COUNT
DEC CX
LEA DI,UNORDLST
MOV BX,ES:[DI]
MOV AX,BX
CHKMIN:ADD DI,2
CMP ES:[DI],BX
JAE CHKMAX
JMP SHORT NEXTTEL
CHKMAX:CMP ES:[DI],AX
JBE NEXTTEL
MOV AX,ES:[DI]
NEXTTEL:LOOP CHKMIN
MOV AH,4CH
INT 21H
CSEG ENDS
END START
16 編寫一個匯編語言子程序,實現(xiàn)將一組(設有N個)7位ASCII碼變?yōu)榕夹r灤a。
答案
CODE SEGMENT
ASSUME CS:CODE,DS:CODE
START:MOV AX,CODE
MOV DS,AX
MOV SI,OFFSET NACSII
MOV CX,7
MOV DX,N
LP0:MOV BL,[SI]
LP1:SHR BL,1
ADC AL,0
LOOP LP1
AND AL,01H
ROR AL,1
OR BL,AL
DEC DX
JNZ LP0
MOV AH,4CH
INT 21H
CODE ENDS
END START
17 試問下列偽指令在存儲區(qū)中分別為各變量分配多少字節(jié)?
VR1 DW10
VR2 DW 6 DUP(?),66,88
VR3 DD 10 DUP(?)
VR4 DB 2DUP(?,8DUP(0))
VR5 DB ‘Happy New Year!’
答案
VR1,VR2,VR3,VR4,VR5分別分配字節(jié)個數(shù)為:20,16,40,18,15。
18 對于給定的符號定義,指出下列指令的錯誤,說明原因。
A EQU 505
B DB ?
C DB 64H
(1) MOV A,AX;(2) MOV B,AX;(3) MOV AX,B
(4) CMP C,AX;(5) CMP A,C; (6) CMP AX,C
答案
(1) 錯。因變量A已通過EQU偽指令賦值為505,故不能再用傳送指令MOV對其賦值。
(2) 錯。類型不匹配,變量B為字節(jié)型,AX為字型。
(3) 錯。類型不匹配。
(4) 錯。類型不匹配,C為字節(jié)型,AX為字型。
(5) 錯。源操作數(shù)和目的操作數(shù)不能同位存儲器類型,且類型也不匹配。
(6) 錯。類型不匹配。
19 對于給定的數(shù)據(jù)定義,各條MOV指令單獨執(zhí)行后有關寄存器的內容是什么?
K1 DB ?
K2 DB 8 DUP(?)
K3 DW 6 DUP(?)
K4 DW ‘1234’
(1) MOV AX TYPE K1
(2) MOV AX,TYPE K3
(3) MOV CL,LENGTH K2
(4) MOV CX,LENGTH K3
(5) MOV CX,LENGTH K4
(6) MOV DX SIZE K3
答案
(1) (AX)=0001H TYPE是存儲單元類型,字節(jié)型為1,字型為2,雙字為4;
(2) (AX)=0002H LENGTH是存儲區(qū)的單元數(shù)目,單元可以是字節(jié)、字或者雙字;
(3) (CL)=08H SIZE存儲區(qū)的字節(jié)數(shù)。
(4) (CX)=0006H
(5) (CX)=0004H
(6) (DX)=000CH
20 對于給定的數(shù)據(jù)定義,變量R1和R2的值分別是多少?
(1) A1 DB 1,2,3 ‘ABC’
A2 DB 0
R1 EQU A2-A1
(2) K1 DW ?
K2 DB 6 DUP(?)
K3 DD ?
R2 EQU $-K1
答案
(1) R1=6 $表示地址計數(shù)器的值
(2) R2=22
21 寫出完成下述要求的變量定義語句:
(1) 為某緩沖區(qū)BUG留出200各字節(jié)的內存空間;
(2) 將字符串‘BYTE’,‘WORD’,‘DWORD’存放于某數(shù)據(jù)區(qū);
(3) 在某數(shù)據(jù)區(qū)要求存入下列5個數(shù)據(jù):
2040H,0300H,10H,0200H,1048H
答案
(1) BUG DB 200DUP(?)
(2) STR1 DB ‘BYTE’
STR2 DB ‘WORD’
STR3 DB ‘DWORD’
(3) DATA DW 2040H,0300H,10H,0200H,1048H
22 分別說明下列指令對的區(qū)別:
(1) MOV AX,VAR1和MOV AX OFFSET VAR1
(2) MOV AX,VAR1與LEA AX,VAR1
答案
(1) MOV AX,VAR1是將變量VAR1的內容送AX;
MOV AX,OFFSET VAR1是將變量VAR1的偏移量送AX。
(2) LEA AX,VAR1也是將變量VAR1的偏移量送AX,與(1)中不同的是采用專門取偏移量指令實現(xiàn)。
23 說明為什么有時候必須使用PTR屬性操作符。
答案
PTR優(yōu)先于隱含的類型屬性,指定操作數(shù)的類型屬性。因為在許多情況下,所使用的操作符類型與原指定的類型不同,又不希望改變原有的設定,只暫時改變操作符類型,則必須使用PTR屬性操作符作為臨時設定,這個臨時設定類型只在本條指令有效。
24 假設VDT1和VDT2為字變量,TAL1和TAL2為標號,說明下列指令是否正確,若正確,說明其尋址方式;若有錯誤指出錯誤所在。
(1) JMP VDT1 (2) JMP NEAR TAL1 (3) JNZ VDT2
(4) JE TAL2 (5) JMP FAR PTR TAL1 (6) JMP TAL1[SI]
答案
(1) 錯。條轉地址應為標號,而非變量。
(2) 錯。指令中缺少PTR.
(3) 錯。條轉地址應為標號,而非變量。
(4) 正確。相對尋址方式。
(5) 正確。直接需尋址方式。
(6) 正確。相對尋址方式。
