《IBM-PC汇编语言程序设计》(第2版)【沈美明 温冬婵】——第七章——自编解析与答案
7.1 編寫一條宏指令CLRB,完成用空格符將一字符區中的字符取代的工作。字符區首地址及其長度為變
元。
答:宏定義如下:
CLRB MACRO N, CFIL
MOV CX, N
CLD
MOV AL, ‘ ’ ;;取空格符的ASCII碼
LEA DI, CFIL
REP STOSB
ENDM
7.2 某工廠計算周工資的方法是每小時的工資率RATE乘以工作時間HOUR,另外每工作滿10小時加獎金3
元,工資總數存放在WAG中。請將周工資的計算編寫成一條宏指令WAGES,并展開宏調用:
WAGES R1, 42, SUM
答:宏定義如下:
WAGES MACRO RATE, HOUR, WAG
MOV AL, HOUR ;;計算周工資(WAG),公式為:HOUR* RATE
MOV BL, RATE
MUL BL
MOV WAG, AX
MOV AL, HOUR ;;計算獎金存入(AX),公式為:HOUR/10的商*3
MOV AH, 0
MOV BL, 10
DIV BL
MOV BL, 3
MUL BL
ADD WAG, AX ;;計算周工資總數
ENDM
宏調用:
WAGES R1, 42, SUM
宏展開:
1 MOV AL, 42
1 MOV BL, R1
1 MUL BL
1 MOV SUM, AX
1 MOV AL, 42
1 MOV AH, 0
1 MOV BL, 10
1 DIV BL
1 MOV BL, 3
1 MUL BL
1 ADD SUM, AX
7.3 給定宏定義如下:(注意:此宏指令的功能是V3←|V1-V2|)
DIF MACRO X, Y
MOV AX, X
SUB AX, Y
ENDM
ABSDIF MACRO V1, V2, V3
LOCAL CONT
PUSH AX
DIF V1, V2
CMP AX, 0
JGE CONT
NEG AX
CONT: MOV V3, AX
POP AX
ENDM
試展開以下調用,并判定調用是否有效。
(1) ABSDIF P1, P2, DISTANCE
(2) ABSDIF [BX], [SI], X[DI], CX
(3) ABSDIF [BX][SI], X[BX][SI], 240H
(4) ABSDIF AX, AX, AX
答:(1) 宏調用 ABSDIF P1, P2, DISTANCE 的宏展開如下:此宏調用有效。
1 PUSH AX
1 DIF P1, P2
1 MOV AX, P1
1 SUB AX, P2
1 CMP AX, 0
1 JGE ??0000
1 NEG AX
1 ??0000: MOV DISTANCE, AX
1 POP AX
(2) 宏調用 ABSDIF [BX], [SI], X[DI], CX 的宏展開如下:此宏調用有效。
1 PUSH AX
1 DIF [BX], [SI]
1 MOV AX, [BX]
1 SUB AX, [SI]
1 CMP AX, 0
1 JGE ??0001
1 NEG AX
1 ??0001: MOV X[DI], AX
1 POP AX
(3) 宏調用 ABSDIF [BX][SI], X[BX][SI], 240H 的宏展開如下:此宏調用無效。
1 PUSH AX
1 DIF [BX][SI], X[BX][SI]
1 MOV AX, [BX][SI]
1 SUB AX, X[BX][SI]
1 CMP AX, 0
1 JGE ??0002
1 NEG AX
1 ??0002: MOV 240H, AX
1 POP AX
(4) 宏調用 ABSDIF AX, AX, AX 的宏展開如下:此宏調用有效但無多大意義。
1 PUSH AX
1 DIF AX, AX
1 MOV AX, AX
1 SUB AX, AX
1 CMP AX, 0
1 JGE ??0003
1 NEG AX
1 ??0003: MOV AX, AX
1 POP AX
7.4 試編制宏定義,要求把存儲器中的一個用EOT(ASCII碼04H)字符結尾的字符串傳送到另一個存儲區
去。
答:宏定義如下:
SEND MACRO SCHARS, DCHARS
LOCAL NEXT, EXIT
PUSH AX
PUSH SI
MOV SI, 0
NEXT: MOV AL, SCHARS[SI]
MOV DCHARS[SI], AL
CMP AL, 04H ;;是EOT字符嗎?
JZ EXIT
INC SI
JMP NEXT
EXIT: POP SI
POP AX
ENDM
7.5 宏指令BIN_SUB完成多個字節數據連減的功能:
RESULT←(A-B-C-D-.)
要相減的字節數據順序存放在首地址為OPERAND的數據區中,減數的個數存放在COUNT單元中,最后結果存入
RESULT單元。請編寫此宏指令。
答:宏定義如下:
BIN_SUB MACRO RESULT, A, OPERAND, COUNT
LOCAL NEXT_SUB
PUSH CX
PUSH BX
PUSH AX
MOV CX, COUNT
MOV AL, A
LEA BX, OPERAND
CLC
NEXT_SUB: SBB AL, [BX]
INC BX
LOOP NEXT_SUB
MOV RESULT, AL
POP AX
POP BX
POP CX
ENDM
7.6 請用宏指令定義一個可顯示字符串GOOD: ‘GOOD STUDENTS: CLASSX NAME’,其中X和NAME在宏調用
時給出。
答:宏定義如下:
DISP_GOOD MACRO X, NAME
GOOD DB ‘GOOD STUDENTS: CLASS&X &NAME’, 0DH, 0AH, ‘$’
ENDM
7.7 下面的宏指令CNT和INC1完成相繼字存儲。
CNT MACRO A, B
A&B DW ?
ENDM
INC1 MACRO A, B
CNT A, %B
B=B+1
ENDM
請展開下列宏調用:
C=0
INC1 DATA, C
INC1 DATA, C
答:宏展開如下:
C=0
INC1 DATA, C
1 DATA0 DW ?
INC1 DATA, C
1 DATA0 DW ? (注意:C為0沒有變)
7.8 定義宏指令并展開宏調用。宏指令JOE把一串信息‘MESSAGE NO. K’存入數據存儲區XK中。宏調用
為:
I=0
JOE TEXT, I
┇
JOE TEXT, I
┇
JOE TEXT, I
┇
答:宏定義如下:
MARY MACRO X, K
X&K DB ‘MESSAGE NO. &K’
ENDM
JOE MACRO A, I
MARY A, %I
I=I+1
ENDM
宏調用和宏展開:
I=0
JOE TEXT, I
1 TEXT0 DB ‘MESSAGE NO. 0’
┇
JOE TEXT, I
1 TEXT1 DB ‘MESSAGE NO. 1’
┇
JOE TEXT, I
1 TEXT2 DB ‘MESSAGE NO. 2’
7.9 宏指令STORE定義如下:
STORE MACRO X, N
MOV X+I, I
I=I+1
IF I-N
STORE X, N
ENDIF
ENDM
試展開下列宏調用:
I=0
STORE TAB, 7
答:宏展開如下:
I=0
STORE TAB, 7
1 MOV TAB+0, 0
1 MOV TAB+1, 1
1 MOV TAB+2, 2
1 MOV TAB+3, 3
1 MOV TAB+4, 4
1 MOV TAB+5, 5
1 MOV TAB+6, 6
7.10 試編寫非遞歸的宏指令,使其完成的工作與7.9題的STORE相同。
答:宏定義如下:
STORE MACRO K
MOV TAB+K, K
ENDM
宏調用:
I=0
REPT 7
STORE %I
I=I+1
ENDM
7.11 試編寫一段程序完成以下功能,如給定名為X的字符串長度大于5時,下列指令將匯編10次。
ADD AX, AX
答:程序段如下:
X DB ‘ABCDEFG’
IF ($-X) GT 5
REPT 10
ADD AX, AX
ENDM
ENDIF
7.12 定義宏指令FINSUM:比較兩個數X和Y(X、Y為數,而不是地址),若X>Y則執行SUM←X+2*Y;否則執行
SUM←2*X+Y。
答:宏定義如下:
CALCULATE MACRO A, B, RESULT ;;計算RESULT←2*A+B
MOV AX, A
SHL AX, 1
ADD AX, B
MOV RESULT, AX
ENDM
FINSUM MACRO X, Y, SUM
IF X GT Y
CALCULATE Y, X, SUM
ELSE
CALCULATE X, Y, SUM
ENDIF
ENDM
7.13 試編寫一段程序完成以下功能:如變元X=‘VT55’,則匯編MOV TERMINAL, 0;否則匯編
MOV TERMINAL, 1。
答:宏定義如下:
BRANCH MACRO X
IFIDN <X>, <VT55>
MOV TERMINAL, 0
ELSE
MOV TERMINAL, 1
ENDIF
ENDM
7.14 對于DOS功能調用,所有的功能調用都需要在AH寄存器中存放功能碼,而其中有一些功能需要在DX中
放一個值。試定義宏指令DOS21,要求只有在程序中定義了緩沖區時,匯編為:
MOV AH, DOSFUNC
MOV DX, OFFSET BUFF
INT 21H
否則,無MOV DX, OFFSET BUFF指令。并展開以下宏調用:
DOS21 01
DOS21 0AH, IPFIELD
答:宏定義如下:
DOS21 MACRO DOSFUNC, BUFF
MOV AH, DOSFUNC
IFDEF BUFF
MOV DX, OFFSET BUFF
ENDIF
INT 21H
ENDM
宏展開:
DOS21 01
1 MOV AH, 01
1 INT 21H
DOS21 0AH, IPFIELD
1 MOV AH, 0AH
1 MOV DX, OFFSET IPFIELD
1 INT 21H
7.15 編寫一段程序,使匯編程序根據SIGN中的內容分別產生不同的指令。如果(SIGN)=0,則用字節變量
DIVD中的無符號數除以字節變量SCALE;如果(SIGN)=1,則用字節變量DIVD中的帶符號數除以字節變量SCALE,
結果都存放在字節變量RESULT中。
答:程序段如下:
MOV AL, DIVD
IF SIGN
MOV AH, 0
DIV SCALE
ELSE
CBW
IDIV SCALE
ENDIF
MOV RESULT, AL
7.16 試編寫宏定義SUMMING,要求求出雙字數組中所有元素之和,并把結果保存下來。該宏定義的啞元應
為數組首址ARRAY,數組長度COUNT和結果存放單元RESULT。
答:宏定義如下:
SUMMING MACRO ARRAY,COUNT,RESULT
LOCAL ADDITION
MOV ESI, 0
MOV ECX, COUNT
ADDITION: MOV EAX, ARRAY[ESI*4] ;;雙字為4字節
ADD RESULT, EAX
ADC RESULT+4, 0 ;;將進位加到結果的高位雙字中
INC ESI
LOOP ADDITION
ENDM
7.17 為下列數據段中的數組編制一程序,調用題7.16的宏定義SUMMING,求出該數組中各元素之和。
DATA DD 101246,274365,843250,475536
SUM DQ ?
答:程序如下:
SUMMING MACRO ARRAY,COUNT,RESULT
LOCAL ADDITION
MOV ESI, 0
MOV ECX, COUNT
ADDITION: MOV EAX, ARRAY[ESI*4] ;;雙字為4字節
ADD RESULT, EAX
ADC RESULT+4, 0 ;;將進位加到結果的高位雙字中
INC ESI
LOOP ADDITION
ENDM
.MODEL SMALL
.386
.DATA
DATA DD 101246,274365,843250,475536
SUM DQ ?
.CODE
START: MOV AX, @DATA
MOV DS, AX
SUMMING DATA, 4, SUM
MOV AX, 4C00H
INT 21H
END START
7.18 如把題7.16中的宏定義存放在一個宏庫中,則題7.17的程序應如何修改?
答:程序修改如下:
INCLUDE MACRO.MAC ;假設存放的宏庫名為MACRO.MAC
.MODEL SMALL
.386
.DATA
DATA DD 101246,274365,843250,475536
SUM DQ ?
.CODE
START: MOV AX, @DATA
MOV DS, AX
SUMMING DATA, 4, SUM
MOV AX, 4C00H
INT 21H
END START
?
參考文章
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版