《IBM-PC汇编语言程序设计》(第2版)【沈美明 温冬婵】——第三章——自编解析与答案
3.1 給定(BX)=637DH,(SI)=2A9BH,位移量D=7237H,試確定在以下各種尋址方式下的有效地址是什么?
(1) 立即尋址
(2) 直接尋址
(3) 使用BX的寄存器尋址
(4) 使用BX的簡接尋址
(5) 使用BX的寄存器相對尋址
(6) 基址變址尋址
(7) 相對基址變址尋址
答:
(1) 操作數在指令中,即立即數;
(2) EA=D=7237H;
(3) 無EA,操作數為(BX)=637DH;
(4) EA=(BX)=637DH;
(5) EA=(BX)+D=0D5B4H;
(6) EA=(BX)+(SI)=8E18H;
(7) EA=(BX)+(SI)+D=1004FH;超過了段的邊界,最高進位位丟失,因此EA=004FH。
3.2 試根據以下要求寫出相應的匯編語言指令
(1) 把BX寄存器和DX寄存器的內容相加,結果存入DX寄存器中。
(2) 用寄存器BX和SI的基址變址尋址方式把存儲器中的一個字節與AL寄存器的內容相加,并把結果送到AL寄存器中。
(3) 用寄存器BX和位移量0B2H的寄存器相對尋址方式把存儲器中的一個字和(CX)相加,并把結果送回存儲器中。
(4) 用位移量為0524H的直接尋址方式把存儲器中的一個字與數2A59H相加,并把結果送回存儲單元中。
(5) 把數0B5H與(AL)相加,并把結果送回AL中。
答:
(1) ADD DX, BX
(2) ADD AL, [BX][SI]
(3) ADD [BX+0B2H], CX
(4) ADD WORD PTR [0524H], 2A59H
(5) ADD AL, 0B5H
3.3 寫出把首地址為BLOCK的字數組的第6個字送到DX寄存器的指令。要求使用以下幾種尋址方式:
(1) 寄存器間接尋址
(2) 寄存器相對尋址
(3) 基址變址尋址
答:
(1)
MOV BX, OFFSET BLOCK ADD BX, (6–1)*2 MOV DX, [BX](2)
MOV BX, OFFSET BLOCK #改為: MOV BX, (6-1)*2 MOV DX, [BX+(6–1)*2] #也可 MOV DX, BLOCK[BX](3)
MOV BX, OFFSET BLOCK MOV SI, (6–1)*2 MOV DX, [BX][SI]3.4 現有(DS)=2000H,(BX)=0100H,(SI)=0002H,(20100H)=12H,(20101H)=34H,(20102H)=56H,(20103H)=78H,(21200H)=2AH,(21201H)=4CH,(21202H)=B7H,(21203H)=65H,試說明下列各條指令執行完后AX寄存器的內容。
(1) MOV AX, 1200H
(2) MOV AX, BX
(3) MOV AX, [1200H]
(4) MOV AX, [BX]
(5) MOV AX, 1100[BX]
(6) MOV AX, [BX][SI]
(7) MOV AX, 1100[BX][SI]
答:
(1) (AX)=1200H
(2) (AX)=0100H
(3) (AX)=4C2AH
(4) (AX)=3412H
(5) (AX)=4C2AH
(6) (AX)=7856H
(7) (AX)=65B7H
3.5 給定(IP)=2BC0H,(CS)=0200H,位移量D=5119H,(BX)=1200H,(DS)=212AH,(224A0H)=0600H,
(275B9H)=098AH,試為以下的轉移指令找出轉移的偏移地址。
(1) 段內直接尋址
(2) 使用BX及寄存器間接尋址方式的段內間接尋址
(3) 使用BX及寄存器相對尋址方式的段內間接尋址
答:
(1) JMP NEAR PTR 5119H ;(IP)=5119H+((IP)+03H)=7CDCH,物理地址PA=09CDCH
(IP)+03H是JMP NEAR PTR 5119H指令的下一條指令的首地址。
(2) JMP WORD PTR [BX] ;(IP)=((DS)*10H+(BX))=0600H,PA=02600H
(3) JMP D[BX] ;(IP)=((DS)*10H+(BX)+D)=098AH,PA=0298AH
3.6 設當前數據段寄存器的內容為1B00H,在數據段的偏移地址2000H單元內,含有一個內容為0FF10H和8000H的指針,它們是一個16位變量的偏移地址和段地址,試寫出把該變量裝入AX的指令序列,并畫圖表示出來。
答:
MOV BX, [2000H] ;圖示如上所示。 MOV AX, [2000H+2] MOV ES, AX MOV AX, ES:[BX]3.7 在0624H單元內有一條二字節JMP SHORT OBJ指令,如其中位移量為(1) 27H,(2) 6BH,(3) 0C6H,試問轉向地址OBJ的值是多少?
答:
(1) OBJ=0624H+02H+27H=064DH
(2) OBJ=0624H+02H+6BH=0691H
(3) OBJ=0624H+02H+0C6H=05ECH ;C6H對應的負數為-3AH(向上轉移,負位移量)
3.8 假定(DS)=2000H,(ES)=2100H,(SS)=1500H,(SI)=00A0H,(BX)=0100H,(BP)=0010H,數據段中變量名VAL的偏移地址為0050H,試指出下列源操作數字段的尋址方式是什么?其物理地址值是多少?
(1) MOV AX, 0ABH? ? ? ? ? ? ? ? (2) MOV AX, BX
(3) MOV AX, [100H]? ? ? ? ? ? ? ?(4) MOV AX, VAL
(5) MOV AX, [BX]? ? ? ? ? ? ? ? ? ?(6) MOV AX,ES:[BX]
(7) MOV AX, [BP]? ? ? ? ? ? ? ? ? ?(8) MOV AX, [SI]
(9) MOV AX, [BX+10]? ? ? ? ? ?(10) MOV AX, VAL[BX]
(11) MOV AX, [BX][SI]? ? ? ? ? (12) MOV AX, VAL[BX][SI]
答:
(1) 立即方式; 操作數在本條指令中
(2) 寄存器尋址方式; 操作數為 (BX)=0100H
(3) 直接尋址方式; PA=20100H
(4) 直接尋址方式; PA=20050H
(5) BX寄存器間接尋址方式; PA=20100H
(6) 附加段BX寄存器間接尋址方式; PA=21100H
(7) BP寄存器間接尋址方式; PA=15010H
(8) SI寄存器間接尋址方式; PA=200A0H
(9) BX寄存器相對尋址方式; PA=20110H
(10) BX寄存器相對尋址方式; PA=20150H
(11) BX和SI寄存器基址變址尋址方式; PA=201A0H
(12) BX和SI寄存器相對基址變址尋址方式; PA=201F0H
3.9 在ARRAY數組中依次存儲了七個字數據,緊接著是名為ZERO的字單元,表示如下:
ARRAY DW 23, 36, 2, 100, 32000, 54, 0 ZERO DW ?(1) 如果BX包含數組ARRAY的初始地址,請編寫指令將數據0傳送給ZERO單元。
(2) 如果BX包含數據0在數組中的位移量,請編寫指令將數據0傳送給ZERO單元。
答:
(1)
MOV AX, [BX+(7-1)*2] MOV [BX+(7)*2], AX(2)
MOV AX, ARRAY [BX] MOV ARRAY [BX+2], AX3.10 如TABLE為數據段中0032單元的符號名,其中存放的內容為1234H,試問以下兩條指令有什么區別?指令執行完后AX寄存器的內容是什么?
MOV AX, TABLE LEA AX, TABLE答:
MOV AX, TABLE是將TABLE單元的內容送到AX,(AX)=1234H
LEA AX,TABLE是將TABLE單元的有效地址送到AX,(AX)=0032H
3.11 執行下列指令后AX寄存器中的內容是什么?
TABLE DW 10, 20, 30, 40, 50 ;000AH, 0014H, 001EH, 0028H, 0032H ENTRY DW 3┇MOV BX, OFFSET TABLEADD BX, ENTRYMOV AX, [BX]答:(AX)=1E00H (TABLE的存儲方式如右圖所示)
3.12 下列ASCII碼串(包括空格符)依次存儲在起始地址為CSTRING的字節單元中:
CSTRING DB ‘BASED ADDRESSING’
請編寫指令將字符串中的第1個和第7個字符傳送給DX寄存器。
答:
MOV DH, CSTRING MOV DL, CSTRING+7-13.13 已知堆棧段寄存器SS的內容是0FFA0H,堆棧指針寄存器SP的內容是00B0H,先執行兩條把8057H和0F79H分別進棧的PUSH指令,再執行一條POP指令。試畫出堆棧區和SP的內容變化過程示意圖(標出存儲單元的物理地址)。
答:堆棧區和SP的內容變化過程示意圖如下左圖所示。
3.14 設(DS)=1B00H,(ES)=2B00H,有關存儲單元的內容如上右圖所示。請寫出兩條指令把字變量X裝入AX寄存器。
答:
MOV BX, [2000H] MOV AX, ES:[BX]3.15 求出以下各十六進制數與十六進制數62A0H之和,并根據結果設置標志位SF、ZF、CF和OF的值。
(1) 1234H? ? (2) 4321H? ? (3) CFA0H? ? ?(4) 9D60H
答:
(1) 和為74D4H;SF=0,ZF=0,CF=0,OF=0
(2) 和為A5C1H;SF=1,ZF=0,CF=0,OF=1
(3) 和為3240H;SF=0,ZF=0,CF=1,OF=0
(4) 和為0000H;SF=0,ZF=1,CF=1,OF=0
3.16 求出以下各十六進制數與十六進制數4AE0H的差值,并根據結果設置標志位SF、ZF、CF和OF的值。
(1) 1234H? ? (2) 5D90H? ? (3) 9090H? ? ?(4) EA04H
答:
(1) 差為C754H;SF=1,ZF=0,CF=1,OF=0
(2) 差為12B0H;SF=0,ZF=0,CF=0,OF=0
(3) 差為45B0H;SF=0,ZF=0,CF=0,OF=1
(4) 差為9F24H;SF=1,ZF=0,CF=0,OF=0
3.17 寫出執行以下計算的指令序列,其中X、Y、Z、R、W均為存放16位帶符號數單元的地址。
(1) Z←W+(Z-X)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (2) Z←W-(X+6)-(R+9)
(3) Z←(W*X)/(Y+6),R←余數? ? ? ? ? ? ? ?(4) Z←((W-X)/5*Y)*2
答:
(1)
MOV AX, Z ;以下程序都未考慮帶符號數的溢出 SUB AX, X ADD AX, W MOV Z, AX(2)
MOV BX, X ADD BX, 6 MOV CX, R ADD CR, 9 MOV AX, W SUB AX, BX SUB AX, CX MOV Z, AX(3)
ADD Y, 6 MOV AX, W IMUL X IDIV Y MOV Z, AX MOV R, DX(4)
MOV AX, W SUB AX, X CWD MOV BX, 5 IDIV BX IMUL Y SHL AX, 1 ;((DX),(AX))*2 RCL DX, 13.18 已知程序段如下:
MOV AX, 1234H ;(AX)=1234H,標志位不變 MOV CL, 4 ;(AX)和標志位都不變 ROL AX, CL ;(AX)=2341H,CF=1,SF和ZF不變 DEC AX ;(AX)=2340H,CF=1不變,SF=0,ZF=0 MOV CX, 4 ;(AX)和標志位都不變 MUL CX ;(AX)=8D00H,CF=OF=0,其它標志無定義 INT 20H試問:
(1) 每條指令執行完后,AX寄存器的內容是什么?
(2) 每條指令執行完后,進位、符號和零標志的值是什么?
(3) 程序結束時,AX和DX的內容是什么?
答:
(1) 見注釋;
(2) 見注釋;
(3) (AX)=8D00H,(DX)=0
3.19 下列程序段中的每條指令執行完后,AX寄存器及CF、SF、ZF和OF的內容是什么?
MOV AX, 0 ;(AX)=0, 標志位不變 DEC AX ;(AX)=0FFFFH, CF不變,SF=1,ZF=0,OF=0 ADD AX, 7FFFH ;(AX)=7FFEH, CF=1,SF=0,ZF=0,OF=0 ADD AX, 2 ;(AX)=8000H, CF=0,SF=1,ZF=0,OF=1 NOT AX ;(AX)=7FFFH, 標志位不變 SUB AX, 0FFFFH ;(AX)=8000H, CF=1,SF=1,ZF=0,OF=1 ADD AX, 8000H ;(AX)=0, CF=1,SF=0,ZF=1,OF=1 SUB AX, 1 ;(AX)=0FFFFH, CF=1,SF=1,ZF=0,OF=0 AND AX, 58D1H ;(AX)=58D1H, CF=0,SF=0,ZF=0,OF=0 SAL AX, 1 ;(AX)=0B1A2H, CF=0,SF=1,ZF=0,OF=1 SAR AX, 1 ;(AX)=0D8D1H, CF=0,SF=1,ZF=0,OF=0 NEG AX ;(AX)= 272FH, CF=1,SF=0,ZF=0,OF=0 ROR AX, 1 ;(AX)= 9397H, CF=1,SF和ZF不變,OF=1答:見注釋。
3.20 變量DATAX和變量DATAY的定義如下:
DATAX DW 0148H DW 2316H DATAY DW 0237H DW 4052H請按下列要求寫出指令序列:
(1) DATAX和DATAY兩個字數據相加,和存放在DATAY中。
(2) DATAX和DATAY兩個雙字數據相加,和存放在從DATAY開始的雙字單元中。
(3) 解釋下列指令的作用:
STC MOV BX, DATAX ADC BX, DATAY(4) DATAX和DATAY兩個字數據相乘(用MUL)。
(5) DATAX和DATAY兩個雙字數據相乘(用MUL)。
(6) DATAX除以23(用DIV)。
(7) DATAX雙字除以字DATAY (用DIV)。
答:
(1)
MOV AX, DATAX ADD DATAY, AX MOV AX, DATAX+2 ADD DATAY+2, AX(2)
MOV AX, DATAX ADD DATAY, AX MOV AX, DATAX+2 ADC DATAY+2, AX MOV DATAY+4, 0 ;用于存放進位位 ADC DATAY+4, 0(3) DATAX和DATAY兩個字數據之和加1,結果存入BX寄存器。
(4)
RESULT1 DW 0 DW 0 RESULT2 DW 0 DW 0 ┇ MOV AX, DATAX MUL DATAY MOV RESULT1 , AX MOV RESULT1+2, DX MOV AX, DATAX+2 MUL DATAY+2 MOV RESULT2 , AX MOV RESULT2+2, DX(5)
AA DW 0 BB DW 0 CC DW 0 DD DW 0 ┇ MOV AX, DATAX MUL DATAY MOV AA , AX MOV BB, DX MOV AX, DATAX MUL DATAY+2 ADD BB, AX ADC CC, DX MOV AX, DATAX+2 MUL DATAY ADD BB, AX ADC CC, DX ADC DD, 0 MOV AX, DATAX+2 MUL DATAY+2 ADD CC, AX ADC DD, DX(6)
MOV AX, DATAX MOV BL, 23 DIV BL(7)
MOV DX, DATAX+2 MOV AX, DATAX DIV DATAY3.21 寫出對存放在DX和AX中的雙字長數求補的指令序列。
答:
NEG DX 也可為: NOT DX NEG AX NOT AX SBB DX, 0 ADD AX, 1 ADC DX, 03.22 試編寫一程序求出雙字長數的絕對值。雙字長數在A和A+2單元中,結果存放在B和B+2單元中。
答:程序段如下:
MOV AX, A MOV DX, A+2 CMP DX, 0 JNS ZHENSHU ;不是負數則轉走 NEG DX NEG AX SBB DX, 0 ZHENSHU: MOV B, AX MOV B+2, DX INT 20H3.23 假設(BX)=0E3H,變量VALUE中存放的內容為79H,確定下列各條指令單獨執行后的結果。
(1) XOR BX, VALUE ;(BX)=9AH,CF、OF都為0,AF無定義,SF=1,ZF=0,PF=1
(2) AND BX, VALUE ;(BX)=61H,CF、OF都為0,AF無定義,SF=0,ZF=0,PF=0
(3) OR BX, VALUE ;(BX)=0FBH,CF、OF都為0,AF無定義,SF=1,ZF=0,PF=0
(4) XOR BX, 0FFH ;(BX)=1CH,CF、OF都為0,AF無定義,SF=0,ZF=0,PF=0
(5) AND BX, 0 ;(BX)=00H,CF、OF都為0,AF無定義,SF=0,ZF=1,PF=1
(6) TEST BX, 01H ;(BX)=0E3H,CF、OF都為0,AF無定義,SF=1,ZF=0,PF=0
答:見注釋。
3.24 試寫出執行下列指令序列后BX寄存器的內容。執行前(BX)=6D16H。
MOV CL, 7 SHR BX, CL答:(BX)=00DAH。
3.25 試用移位指令把十進制數+53和-49分別乘以2。它們應該用什么指令?得到的結果是什么?如果要除以2呢?
答:
MOV AL, 53 SAL AL, 1 ;(AL)=(+53*2)=6AH MOV AL, -49 SAL AL, 1 ;(AL)=(-49*2)=9EH MOV AL, 53 SAR AL, 1 ;(AL)=(53/2)= 1AH MOV AL, -49 SAR AL, 1 ;(AL)=(-49/2)=0E7H3.26 試分析下面的程序段完成什么功能?
MOV CL, 04 SHL DX, CL MOV BL, AH SHL AX, CL SHR BL, CL OR DL, BL答:本程序段將 ((DX),(AX)) 的雙字同時左移4位,即將此雙字乘以10H (16)。
3.27 假定(DX)=0B9H,(CL)=3,(CF)=1,確定下列各條指令單獨執行后DX中的值。
(1) SHR DX, 1 ;(DX)=05CH
(2) SAR DX, CL ;(DX)=17H
(3) SHL DX, CL ;(DX)=5C8H
(4) SHL DL, 1 ;(DX)=72H
(5) ROR DX, CL ;(DX)=2017H
(6) ROL DL, CL ;(DX)=0CDH
(7) SAL DH, 1 ;(DX)=0B9H
(8) RCL DX, CL ;(DX)=2CCH
(9) RCR DL, 1 ;(DX)=0DCH
答:見注釋。
3.28 下列程序段執行完后,BX寄存器的內容是什么?
MOV CL, 3 MOV BX, 0B7H ROL BX,1 ROR BX, CL答:(BX)=0C02DH。
3.29 假設數據段定義如下:
CONAME DB ‘SPACE EXPLORERS INC.’ PRLINE DB 20 DUP (‘’)用串指令編寫程序段分別完成以下功能:
(1) 從左到右把CONAME中的字符串傳送到PRLINE。
(2) 從右到左把CONAME中的字符串傳送到PRLINE。
(3) 把CONAME中的第3和第4個字節裝入AX。
(4) 把AX寄存器的內容存入從PRLINE+5開始的字節中。
(5) 檢查CONAME字符串中有無空格字符,如有則把第一個空格字符的地址傳送給BX寄存器。
答:(1)
MOV CX, 20 CLD MOV SI, SEG CONAME MOV DS, SI MOV ES, SI LEA SI, CONAME LEA DI, PRLINE REP MOVSB(2)
MOV CX, 20 STD MOV SI, SEG CONAME MOV DS, SI MOV ES, SI LEA SI, CONAME ADD SI, 20-1 LEA DI, PRLINE ADD DI, 20-1 REP MOVSB(3)
MOV AX, WORD PTR CONAME+3-1(4)
MOV WORD PTR PRLINE +5, AX(5)
MOV AL, ‘ ’ ;空格的ASCII碼送AL寄存器 CLD MOV DI, SEG CONAME MOV ES, DI LEA DI, CONAME REPNE SCASB JNE NEXT DEC DI MOV BX, DI NEXT: ┇3.30 編寫程序段,把字符串STRING中的‘&’字符用空格符代替。
STRING DB ‘The date is FEB&03’
答:程序段如下:
MOV CX, 18 MOV AL, ‘&’ CLD MOV DI, SEG STRING MOV ES, DI LEA DI, STRING REPNE SCASB JNE NEXT DEC DI MOV ES:BYTE PTR [DI], ‘ ’ ;送空格符 NEXT: ┇3.31 假設數據段中數據定義如下:
STUDENT_NAME DB 30 DUP (?) STUDENT_ADDR DB 9 DUP (?) PRINT_LINE DB 132 DUP (?)分別編寫下列程序段:
(1) 用空格符清除PRINT_LINE域。
(2) 在STUDENT_ADDR中查找第一個‘-’。
(3) 在STUDENT_ADDR中查找最后一個‘-’。
(4) 如果STUDENT_NAME域中全是空格符時,填入‘*’。
(5) 把STUDENT_NAME移到PRINT_LINE的前30個字節中,把STUDENT_ ADDR移到PRINT_LINE的后9個字節中。
答:公共的程序段如下:
MOV DI, DS MOV ES, DI(1)
MOV CX, 132 MOV AL., ‘ ’ ;空格的ASCII碼送AL寄存器 CLD LEA DI, PRINT_LINE REP STOSB(2)
MOV CX, 9 MOV AL., ‘-’ CLD LEA DI, STUDENT_ ADDR REPNE SCASB JNE NO_DASH DEC DI NO_DASH: ┇(3)
MOV CX, 9 MOV AL., ‘-’ STD LEA DI, STUDENT_ ADDR ADD DI, 9-1 REPNE SCASB JNE NO_DASH INC DI NO_DASH: ┇(4)?
MOV CX, 30 MOV AL, ‘ ’ ;空格的ASCII碼送AL寄存器 CLD LEA DI, STUDENT_NAME REPE SCASB JNE NEXT MOV CX, 30 MOV AL, ‘*’ ;“*”的ASCII碼送AL寄存器 LEA DI, STUDENT_NAME REP STOSB NEXT: ┇(5)
MOV CX, 30 CLD LEA SI, STUDENT_NAME LEA DI, PRINT_LINE REP MOVSB MOV CX, 9 STD LEA SI, STUDENT_ADDR+9-1 LEA DI, PRINT_LINE+132-1 REP MOVSB3.32 編寫一程序段:比較兩個5字節的字符串OLDS和NEWS,如果OLDS字符串不同于NEWS字符串則執行NEW_LESS;否則順序執行程序。
答:程序段如下:
MOV CX, 5 CLD MOV DI, SEG OLDS MOV DS, DI MOV ES, DI LEA SI, OLDS LEA DI, NEWS REPE CMPSB JNE NEW_LESS ┇ NEW_LESS: ┇3.33 假定AX和BX中的內容為帶符號數,CX和DX中的內容為無符號數,請用比較指令和條件轉移指令實現以下判斷:
(1) 若DX的內容超過CX的內容,則轉去執行EXCEED。
(2) 若BX的內容大于AX的內容,則轉去執行EXCEED。
(3) 若CX的內容等于0,則轉去執行ZERO。
(4) BX與AX的內容相比較是否產生溢出?若溢出則轉OVERFLOW。
(5) 若BX的內容小于等于AX的內容,則轉EQ_SMA。
(6) 若DX的內容低于等于CX的內容,則轉EQ_SMA。
答:(1)
CMP DX, CX JA EXCEED(2)
CMP BX, AX JG EXCEED(3)
JCXZ ZERO(4)
CMP BX, AX JO OVERFLOW(5)
CMP BX, AX JLE EQ_SMA(6)
CMP DX, CX JBE EQ_SMA3.34 試分析下列程序段:
ADD AX, BX JNO L1 JNC L2 SUB AX, BX JNC L3 JNO L4 JMP SHORT L5如果AX和BX的內容給定如下:
AX BX
(1) 147BH 80DCH
(2) B568H 42C8H
(3) 42C8H 608DH
(4) D023H 9FD0H
(5) 94B7H B568H
問該程序分別在上面5種情況下執行后,程序轉向哪里?
答:
(1) 轉向L1
(2) 轉向L1
(3) 轉向L2
(4) 轉向L5 ;因為加法指令后AX中已經是6FF3H
(5) 轉向L5 ;因為加法指令后AX中已經是4A14H
3.35 指令CMP AX, BX后面跟著一條格式為J. L1的條件轉移指令,其中.可以是
B、NB、BE、NBE、L、NL、LE、NLE中的任意一個。如果AX和BX的內容給定如下:
AX BX
(1) 1F52H 1F52H
(2) 88C9H 88C9H
(3) FF82H 007EH
(4) 58BAH 020EH
(5) FFC5H FF8BH
(6) 09A0H 1E97H
(7) 8AEAH FC29H
(8) D367H 32A6H
問以上8條轉移指令中的哪幾條將引起轉移到L1?
答:
(1) JNB、JBE、JNL、JLE
(2) JNB、JBE、JNL、JLE
(3) JNB、JNBE、JL、JLE
(4) JNB、JNBE、JNL、JNLE
(5) JNB、JNBE、JL、JLE
(6) JB、JBE、JL、JLE
(7) JB、JBE、JNL、JNLE
(8) JNB、JNBE、JL、JLE
3.36 假設X和X+2單元的內容為雙精度數p,Y和Y+2單元的內容為雙精度數q,(X和Y為低位字)試說明下列程
序段做什么工作?
答:此程序段判斷p*2>q,則使(AX)=1后退出;p*2≤q,則使(AX)=2后退出。
3.37 要求測試在STATUS中的一個字節,如果第1、3、5位均為1則轉移到ROUTINE_1;如果此三位中有兩位為1則轉移到ROUTINE_2;如果此三位中只有一位為1則轉移到ROUTINE_3;如果此三位全為0則轉移到ROUTINE_4。試畫出流程圖,并編制相應的程序段。
答:程序段如下:
MOV AL, STATUS、 AND AL, 00010101B ;只保留第1、3、5位 JZ ROUTINE_4 ;3位全為0轉ROUTINE_4 JPE ROUTINE_2 ;兩位為1轉ROUTINE_2 CMP AL, 00010101B JZ ROUTINE_1 ;3位全為1轉ROUTINE_1 ROUTINE_3: ┇ ;僅一位為1執行ROUTINE_3 JMP EXIT ROUTINE_1: ┇ JMP EXIT ROUTINE_2: ┇ JMP EXIT ROUTINE_4: ┇ EXIT: INT 20H3.38 在下列程序的括號中分別填入如下指令:
(1) LOOP L20
(2) LOOPE L20
(3) LOOPNE L20
試說明在三種情況下,當程序執行完后,AX、BX、CX、DX四個寄存器的內容分別是什么?
TITLE EXLOOP.COM CODESG SEGMENT ASSUME CS:CODESG, DS: CODSEG, SS: CODSEG ORG 100H BEGIN: MOV AX, 01 MOV BX, 02 MOV DX, 03 MOV CX, 04 L20: INC AX ADD BX, AX SHR DX, 1 ( ) RET CODESG ENDS END BEGIN答:
(1) (AX)=5H,(BX)=10H,(CX)=0H,(DX)=0H
(2) (AX)=2H,(BX)=4H,(CX)=3H,(DX)=1H
(3) (AX)=3H,(BX)=7H,(CX)=2H,(DX)=0H
3.39 考慮以下的調用序列:
(1) MAIN調用NEAR的SUBA過程(返回的偏移地址為0400);
(2) SUBA調用NEAR的SUBB過程(返回的偏移地址為0A00);
(3) SUBB調用FAR的SUBC過程(返回的段地址為B200,返回的偏移地址為0100);
(4) 從SUBC返回SUBB;
(5) SUBB調用NEAR的SUBD過程(返回的偏移地址為0C00);
(6) 從SUBD返回SUBB;
(7) 從SUBB返回SUBA;
(8) 從SUBA返回MAIN;
(9) 從MAIN調用SUBC(返回的段地址為1000,返回的偏移地址為0600);
請畫出每次調用及返回時的堆棧狀態。
答:每次調用及返回時的堆棧狀態圖如下所示:
3.40 假設(EAX)=00001000H,(EBX)=00002000H,(DS)=0010H,試問下列指令訪問內存的物理地址是什么?
(1) MOV ECX,[EAX+EBX]
(2) MOV [EAX+2*EBX],CL
(3) MOV DH,[EBX+4*EAX+1000H]
答:
(1) PA=(DS)*10H+EA=00100H+00001000H+00002000H=00003100H
(2) PA=(DS)*10H+EA=00100H+00001000H+2*00002000H=00005100H
(3) PA=(DS)*10H+EA=00100H+00002000H+4*00001000H+1000H=00007100H
3.41 假設(EAX)=9823F456H,(ECX)=1F23491H,(BX)=348CH,(SI)=2000H,(DI)=4044H。在DS段中從偏移地址4044H單元開始的4個字節單元中,依次存放的內容為92H,6DH,0A2H和4CH,試問下列各條指令執行完后的目的地址及其中的內容是什么?
(1) MOV [SI],EAX
(2) MOV [BX],ECX
(3) MOV EBX,[DI]
答:
(1) 目的地址為DS:2000H,內容依次為:56H,0F4H,23H和98H
(2) 目的地址為DS:348CH,內容依次為:91H,34H,0F2H和01H
(3) 目的操作數為EBX寄存器,(EBX)=4CA26D92H
3.42 說明下列指令的操作
(1) PUSH AX ;將(AX)壓入堆棧
(2) POP ESI ;將堆棧中的雙字彈出到ESI寄存器中
(3) PUSH [BX] ;將((BX))對應存儲單元中的字壓入堆棧
(4) PUSHAD ;32位通用寄存器依次進棧
(5) POP DS ;將堆棧中的字彈出到DS寄存器中
(6) PUSH 4 ;將立即數4以字的方式壓入堆棧
答:見注釋。
3.43 請給出下列各指令序列執行完后目的寄存器的內容。
(1) MOV EAX,299FF94H ADD EAX,34FFFFH ;(EAX)= 2CEFF93H (2) MOV EBX,40000000 SUB EBX,1500000 ;(EBX)= 3EB00000H (3) MOV EAX,39393834H AND EAX,0F0F0F0FH ;(EAX)= 09090804H (4) MOV EDX,9FE35DH XOR EDX,0F0F0F0H ;(EDX)= 6F13ADH答:見注釋。
3.44 請給出下列各指令序列執行完后目的寄存器的內容。
(1) MOV BX,-12 MOVSX EBX,BX ;(EBX)= 0FFFF FFF4H (2) MOV CL,-8 MOVSX EDX,CL ;(EDX)= 0FFFF FFF8H (3) MOV AH,7 MOVZX ECX,AH ;(ECX)= 0000 0007H (4) MOV AX,99H MOVZX EBX,AX ;(EBX)= 0000 0099H答:見注釋。
3.45 請給出下列指令序列執行完后EAX和EBX的內容。
MOV ECX,307 F455H BSF EAX,ECX ;(EAX)= 0D BSR EBX,ECX ;(EBX)= 25D答:見注釋。
3.46 請給出下列指令序列執行完后AX和DX的內容。
MOV BX,98H BSF AX,BX ;(AX)= 3D BSR DX,BX ;(DX)= 7D答:見注釋。
3.47 請編寫一程序段,要求把ECX、EDX和ESI的內容相加,其和存入EDI寄存器中(不考慮溢出)。
答:
MOV EDI,0 也可為: MOV EDI,ECX ADD EDI,ECX ADD EDI,EDX ADD EDI,EDX ADD EDI,ESI ADD EDI,ESI3.48 請說明IMUL BX,DX,100H指令的操作。
答:(BX)←(DX)*100H
3.49 試編寫一程序段,要求把BL中的數除以CL中的數,并把其商乘以2,最后的結果存入DX寄存器中。
答:
MOV AL,BL MOV AH,0 ;假定為無符號數,否則用CBW指令即可 DIV CL MOV AH,0 SHL AX,1 MOV DX,AX3.50 請說明JMP DI和JMP [DI]指令的區別。
答:JMP DI是轉移到以(DI)內容為偏移地址的單元去執行指令;JMP [DI]是轉移到以(DI)間接尋址的內存單元內容為偏移地址的單元去執行指令。
3.51 試編寫一程序段,要求在長度為100H字節的數組中,找出大于42H的無符號數的個數并存入字節單元
UP中;找出小于42H的無符號數的個數并存入字節單元DOWN中。
答:
JMP BEGIN UP DB 0 DOWN DB 0 TABLE DB 100H DUP (?) ;數組 BEGIN: MOV CX,100H MOV BX,-1 MOV SI,0 MOV DI,0 L1:INC BX CMP TABLE[BX],42H JA L2 JB L3 JMP L4 L2:INC SI JMP L4 L3:INC DI L4:LOOP L1 MOV UP,SI MOV DOWN,DI3.52 請用圖表示ENTER 16,0所生成的堆棧幀的情況。
?答:
參考文章
http://blog.sina.com.cn/s/blog_77f58b350100q4dv.html
https://wenku.baidu.com/view/303e0e114431b90d6c85c720.html
https://shentuzhigang.blog.csdn.net/article/details/106560578
總結
以上是生活随笔為你收集整理的《IBM-PC汇编语言程序设计》(第2版)【沈美明 温冬婵】——第三章——自编解析与答案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《IBM-PC汇编语言程序设计》(第2版
- 下一篇: 《IBM-PC汇编语言程序设计》(第2版