《IBM-PC汇编语言程序设计》(第2版)【沈美明 温冬婵】——第四章——自编解析与答案
4.1 指出下列指令的錯誤:
(1) MOV AH, BX ;寄存器類型不匹配
(2) MOV [BX], [SI] ;不能都是存儲器操作數
(3) MOV AX, [SI][DI] ;[SI]和[DI]不能一起使用
(4) MOV MYDAT [BX][SI], ES:AX ;AX寄存器不能使用段超越
(5) MOV BYTE PTR [BX], 1000 ;1000超過了一個字節的范圍
(6) MOV BX, OFFSET MYDAT [SI] ;MYDAT [SI]已經是偏移地址,不能再使用OFFSET
(7) MOV CS, AX ;CS不能用作目的寄存器
(8) MOV ECX, AX ;兩個操作數的數據類型不同
答:見注釋。
4.2 下面哪些指令是非法的?(假設OP1,OP2是已經用DB定義的變量)
(1) CMP 15, BX ;錯,立即數不能作為目的操作數
(2) CMP OP1, 25
(3) CMP OP1, OP2 ;錯,不能都是存儲器操作數
(4) CMP AX, OP1 ;錯,類型不匹配,應為CMP ax,
word ptr op1
答:見注釋。
4.3 假設下列指令中的所有標識符均為類型屬性為字的變量,請指出下列哪些指令是非法的?它們的錯誤
是什么?
(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
答:見注釋。
4.4 假設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
答:見注釋。
4.5 畫圖說明下列語句所分配的存儲空間及初始化的數據值。
(1) BYTE_VAR DB ‘BYTE’,12,-12H,3 DUP(0,?,2 DUP(1,2),?)
(2) WORD_VAR DW 5 DUP(0,1,2),?,-5,‘BY’,‘TE’,256H
答:答案如下圖所示。
4.6 試列出各種方法,使匯編程序把5150H存入一個存儲器字中(如:DW 5150H)。
答:DW 5150H
DB 50H, 51H
DB ‘PQ’
DW ‘QP’
ORG 5150H
DW $
4.7 請設置一個數據段DATASG,其中定義以下字符變量或數據變量。
(1) FLD1B為字符串變量:‘personal computer’;
(2) FLD2B為十進制數字節變量:32;
(3) FLD3B為十六進制數字節變量:20;
(4) FLD4B為二進制數字節變量:01011001;
(5) FLD5B為數字的ASCII字符字節變量:32654;
(6) FLD6B為10個零的字節變量;
(7) FLD7B為零件名(ASCII碼)及其數量(十進制數)的表格:
PART1 20
PART2 50
PART3 14
(8) FLD1W為十六進制數字變量:FFF0;
(9) FLD2W為二進制數的字變量:01011001;
(10) FLD3W為(7)零件表的地址變量;
(11) FLD4W為包括5個十進制數的字變量:5,6,7,8,9;
(12) FLD5W為5個零的字變量;
(13) FLD6W為本段中字數據變量和字節數據變量之間的地址差。
答:DATASG SEGMENT
FLD1B DB ‘personal computer’
FLD2B DB 32
FLD3B DB 20H
FLD4B DB 01011001B
FLD5B DB ‘32654’
FLD6B DB 10 DUP (0)
FLD7B DB ‘PART1’, 20
DB ‘PART2’, 50
DB ‘PART3’, 14
FLD1W DW 0FFF0H
FLD2W DW 01011001B
FLD3W DW FLD7B
FLD4W DW 5, 6, 7, 8, 9
FLD5W DW 5 DUP (0)
FLD6W DW FLD1W-FLD1B
DATASG ENDS
4.8 假設程序中的數據定義如下:
PARTNO DW ?
PNAME DB 16 DUP (?)
COUNT DD ?
PLENTH EQU $-PARTNO
問PLENTH的值為多少?它表示什么意義?
答:PLENTH=22=16H,它表示變量PARTNO、PNAME、COUNT總共占用的存儲單元數(字節數)。
4.9 有符號定義語句如下:
BUFF DB 1, 2, 3, ‘123’
EBUFF DB 0
L EQU EBUFF - BUFF
問L的值是多少?
答:L=6。
4.10 假設程序中的數據定義如下:
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 $ - CODE_LIST ;此語句必須放在CODE_LIST語句之后
4.11 試寫出一個完整的數據段DATA_SEG,它把整數5賦予一個字節,并把整數-1,0,2,5和4放在10字數
組DATA_LIST的頭5個單元中。然后,寫出完整的代碼段,其功能為:把DATA_LIST中頭5個數中的最大值和最小
值分別存入MAX和MIN單元中。
答:DATA_SEG SEGMENT
NUM DB 5
DATA_LIST DW -1, 0, 2, 5, 4, 5 DUP (?)
MAX DW ?
MIN DW ?
DATA_SEG ENDS
;----------------------------------------------------------------
CODE_SEG SEGMENT
MAIN PROC FAR
ASSUME CS: CODE_SEG, DS: DATA_SEG
START: PUSH DS ;設置返回DOS
SUB AX, AX
PUSH AX
MOV AX, DATA_SEG ;給DS賦值
MOV DS, AX
;
MOV CX, 4 ;程序段開始
LEA BX, DATA_LIST
MOV AX, [BX]
MOV MAX, AX
MOV MIN, AX
ROUT1: ADD BX, 2
MOV AX, [BX]
CMP AX, MAX
JNGE ROUT2
MOV MAX, AX
ROUT2: CMP AX, MIN
JNLE ROUT3
MOV MIN, AX
ROUT3: LOOP ROUT1 ;程序段結束
RET
MAIN ENDP
CODE_SEG ENDS
;----------------------------------------------------------------
END START
4.12 給出等值語句如下:
ALPHA EQU 100
BETA EQU 25
GAMMA EQU 2
下列表達式的值是多少?
(1) ALPHA * 100 + BETA ;=2729H
(2) ALPHA MOD GAMMA + BETA ;=19H
(3) (ALPHA +2) * BETA – 2 ;=9F4H
(4) (BETA / 3) MOD 5 ;=3H
(5) (ALPHA +3) * (BETA MOD GAMMA) ;=67H
(6) ALPHA GE GAMMA ;=0FFFFH
(7) BETA AND 7 ;=01H
(8) GAMMA OR 3 ;=03H
答:見注釋。
4.13 對于下面的數據定義,三條MOV指令分別匯編成什么?(可用立即數方式表示)
TABLEA DW 10 DUP (?)
TABLEB DB 10 DUP (?)
TABLEC DB ‘1234’
┇
MOV AX, LENGTH TABLEA ;匯編成MOV AX, 000AH
MOV BL, LENGTH TABLEB ;匯編成MOV BL, 000AH
MOV CL, LENGTH TABLEC ;匯編成MOV CL, 0001H
答:見注釋。
4.14 對于下面的數據定義,各條MOV指令單獨執行后,有關寄存器的內容是什么?
FLDB DB ?
TABLEA DW 20 DUP (?)
TABLEB DB ‘ABCD’
(1) MOV AX, TYPE FLDB ;(AX)=0001H
(2) MOV AX, TYPE TABLEA ;(AX)=0002H
(3) MOV CX, LENGTH TABLEA ;(CX)=0014H
(4) MOV DX, SIZE TABLEA ;(DX)=0028H
(5) MOV CX, LENGTH TABLEB ;(CX)=0001H
答:見注釋。
4.15 指出下列偽操作表達方式的錯誤,并改正之。
(1) DATA_SEG SEG ;DATA_SEG SEGMENT(偽操作
錯)
(2) SEGMENT ‘CODE’ ;SEGNAME SEGMENT ‘CODE’(缺
少段名字)
(3) MYDATA SEGMENT/DATA ;MYDATA SEGMENT
┇
ENDS ;MYDATA ENDS(缺少段名字)
(4) MAIN_PROC PROC FAR ;刪除END MAIN_PROC也可以
┇
END MAIN_PROC ;MAIN_PROC ENDP ;上下兩句交換位置
MAIN_PROC ENDP ; END
MAIN_PROC
答:見注釋。
4.16 按下面的要求寫出程序的框架
(1) 數據段的位置從0E000H開始,數據段中定義一個100字節的數組,其類型屬性既是字又是字節;
(2) 堆棧段從小段開始,段組名為STACK;
(3) 代碼段中指定段寄存器,指定主程序從1000H開始,給有關段寄存器賦值;
(4) 程序結束。
答:程序的框架如下:
DATA_SEG SEGMENT AT 0E000H
ARRAY_B LABEL BYTE
ARRAY_W DW 50 DUP (?)
DATA_SEG ENDS ;以上定義數據段
;----------------------------------------------------------------
STACK_SEG SEGMENT PARA STACK ‘STACK’
DW 100H DUP (?)
TOS LABEL WORD
STACK_SEG ENDS ;以上定義堆棧段
;----------------------------------------------------------------
CODE_SEG SEGMENT
MAIN PROC FAR
ASSUME CS: CODE_SEG, DS: DATA_SEG, SS: STACK_SEG
ORG 1000H
START: MOV AX, STACK_SEG
MOV SS, AX ;給SS賦值
MOV SP, OFFSET TOS ;給SP賦值
PUSH DS ;設置返回DOS
SUB AX, AX
PUSH AX
MOV AX, DATA_SEG
MOV DS, AX ;給DS賦值
┇ ;程序段部分
RET
MAIN ENDP
CODE_SEG ENDS ;以上定義代碼段
;----------------------------------------------------------------
END START
4.17 寫一個完整的程序放在代碼段C_SEG中,要求把數據段D_SEG中的AUGEND和附加段E_SEG中的ADDEND相
加,并把結果存放在D_SEG 段中的SUM中。其中AUGEND、ADDEND和SUM均為雙精度數,AUGEND賦值為
99251,ADDEND賦值為 -15962。
答:程序如下:
D_SEG SEGMENT
AUGW LABEL WORD
AUGEND DD 99251
SUM DD ?
D_SEG ENDS ;以上定義數據段
;----------------------------------------------------------------
E_SEG SEGMENT
ADDW LABEL WORD
ADDEND DD -15962
E_SEG ENDS ;以上定義附加段
;----------------------------------------------------------------
C_SEG SEGMENT
MAIN PROC FAR
ASSUME CS: C_SEG, DS: D_SEG, ES: E_SEG
START: PUSH DS ;設置返回DOS
SUB AX, AX
PUSH AX
MOV AX, D_SEG
MOV DS, AX ;給DS賦值
MOV AX, E_SEG
MOV ES, AX ;給ES賦值
;
MOV AX, AUGW ;以下6條指令進行加法計算
MOV BX, AUGW+2
ADD AX, ES: ADDW
ADC BX, ES: ADDW+2 ;不考慮有符號數溢出
MOV WORD PTR SUM, AX
MOV WORD PTR [SUM+2], BX
RET
MAIN ENDP
C_SEG ENDS ;以上定義代碼段
;----------------------------------------------------------------
END START
4.18 請說明表示程序結束的微操作和結束程序執行的語句之間的差別。它們在源程序中應如何表示?
答:表示程序結束的微操作是指示匯編程序MASM結束匯編的標志,在源程序中用END表示;結束程序執行的語
句是結束程序運行而返回操作系統的指令,在源程序中有多種表示方法,比如INT 20H或MOV AX, 4C00H
INT 21H以及RET等。
4.19 試說明下述指令中哪些需要加上PTR操作符:
BVAL DB 10H,20H
WVAL DW 1000H
(1) MOV AL,BVAL ;不需要
(2) MOV DL,[BX] ;不需要
(3) SUB [BX],2 ;需要,如SUB BYTE PTR [BX],2
(4) MOV CL,WVAL ;需要,如MOV CL,BYTE PTR WVAL
(5) ADD AL,BVAL+1 ;不需要
答:見注釋。
?
參考文章
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版