《IBM-PC汇编语言程序设计》(第2版)【沈美明 温冬婵】——第七章——自编解析与答案
7.1 編寫一條宏指令CLRB,完成用空格符將一字符區(qū)中的字符取代的工作。字符區(qū)首地址及其長(zhǎng)度為變
元。
答:宏定義如下:
CLRB MACRO N, CFIL
MOV CX, N
CLD
MOV AL, ‘ ’ ;;取空格符的ASCII碼
LEA DI, CFIL
REP STOSB
ENDM
7.2 某工廠計(jì)算周工資的方法是每小時(shí)的工資率RATE乘以工作時(shí)間HOUR,另外每工作滿10小時(shí)加獎(jiǎng)金3
元,工資總數(shù)存放在WAG中。請(qǐng)將周工資的計(jì)算編寫成一條宏指令WAGES,并展開宏調(diào)用:
WAGES R1, 42, SUM
答:宏定義如下:
WAGES MACRO RATE, HOUR, WAG
MOV AL, HOUR ;;計(jì)算周工資(WAG),公式為:HOUR* RATE
MOV BL, RATE
MUL BL
MOV WAG, AX
MOV AL, HOUR ;;計(jì)算獎(jiǎng)金存入(AX),公式為:HOUR/10的商*3
MOV AH, 0
MOV BL, 10
DIV BL
MOV BL, 3
MUL BL
ADD WAG, AX ;;計(jì)算周工資總數(shù)
ENDM
宏調(diào)用:
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
試展開以下調(diào)用,并判定調(diào)用是否有效。
(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) 宏調(diào)用 ABSDIF P1, P2, DISTANCE 的宏展開如下:此宏調(diào)用有效。
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) 宏調(diào)用 ABSDIF [BX], [SI], X[DI], CX 的宏展開如下:此宏調(diào)用有效。
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) 宏調(diào)用 ABSDIF [BX][SI], X[BX][SI], 240H 的宏展開如下:此宏調(diào)用無(wú)效。
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) 宏調(diào)用 ABSDIF AX, AX, AX 的宏展開如下:此宏調(diào)用有效但無(wú)多大意義。
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 試編制宏定義,要求把存儲(chǔ)器中的一個(gè)用EOT(ASCII碼04H)字符結(jié)尾的字符串傳送到另一個(gè)存儲(chǔ)區(qū)
去。
答:宏定義如下:
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完成多個(gè)字節(jié)數(shù)據(jù)連減的功能:
RESULT←(A-B-C-D-.)
要相減的字節(jié)數(shù)據(jù)順序存放在首地址為OPERAND的數(shù)據(jù)區(qū)中,減數(shù)的個(gè)數(shù)存放在COUNT單元中,最后結(jié)果存入
RESULT單元。請(qǐng)編寫此宏指令。
答:宏定義如下:
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 請(qǐng)用宏指令定義一個(gè)可顯示字符串GOOD: ‘GOOD STUDENTS: CLASSX NAME’,其中X和NAME在宏調(diào)用
時(shí)給出。
答:宏定義如下:
DISP_GOOD MACRO X, NAME
GOOD DB ‘GOOD STUDENTS: CLASS&X &NAME’, 0DH, 0AH, ‘$’
ENDM
7.7 下面的宏指令CNT和INC1完成相繼字存儲(chǔ)。
CNT MACRO A, B
A&B DW ?
ENDM
INC1 MACRO A, B
CNT A, %B
B=B+1
ENDM
請(qǐng)展開下列宏調(diào)用:
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 定義宏指令并展開宏調(diào)用。宏指令JOE把一串信息‘MESSAGE NO. K’存入數(shù)據(jù)存儲(chǔ)區(qū)XK中。宏調(diào)用
為:
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
宏調(diào)用和宏展開:
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
試展開下列宏調(diào)用:
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
宏調(diào)用:
I=0
REPT 7
STORE %I
I=I+1
ENDM
7.11 試編寫一段程序完成以下功能,如給定名為X的字符串長(zhǎng)度大于5時(shí),下列指令將匯編10次。
ADD AX, AX
答:程序段如下:
X DB ‘ABCDEFG’
IF ($-X) GT 5
REPT 10
ADD AX, AX
ENDM
ENDIF
7.12 定義宏指令FINSUM:比較兩個(gè)數(shù)X和Y(X、Y為數(shù),而不是地址),若X>Y則執(zhí)行SUM←X+2*Y;否則執(zhí)行
SUM←2*X+Y。
答:宏定義如下:
CALCULATE MACRO A, B, RESULT ;;計(jì)算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 試編寫一段程序完成以下功能:如變?cè)猉=‘VT55’,則匯編MOV TERMINAL, 0;否則匯編
MOV TERMINAL, 1。
答:宏定義如下:
BRANCH MACRO X
IFIDN <X>, <VT55>
MOV TERMINAL, 0
ELSE
MOV TERMINAL, 1
ENDIF
ENDM
7.14 對(duì)于DOS功能調(diào)用,所有的功能調(diào)用都需要在AH寄存器中存放功能碼,而其中有一些功能需要在DX中
放一個(gè)值。試定義宏指令DOS21,要求只有在程序中定義了緩沖區(qū)時(shí),匯編為:
MOV AH, DOSFUNC
MOV DX, OFFSET BUFF
INT 21H
否則,無(wú)MOV DX, OFFSET BUFF指令。并展開以下宏調(diào)用:
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 編寫一段程序,使匯編程序根據(jù)SIGN中的內(nèi)容分別產(chǎn)生不同的指令。如果(SIGN)=0,則用字節(jié)變量
DIVD中的無(wú)符號(hào)數(shù)除以字節(jié)變量SCALE;如果(SIGN)=1,則用字節(jié)變量DIVD中的帶符號(hào)數(shù)除以字節(jié)變量SCALE,
結(jié)果都存放在字節(jié)變量RESULT中。
答:程序段如下:
MOV AL, DIVD
IF SIGN
MOV AH, 0
DIV SCALE
ELSE
CBW
IDIV SCALE
ENDIF
MOV RESULT, AL
7.16 試編寫宏定義SUMMING,要求求出雙字?jǐn)?shù)組中所有元素之和,并把結(jié)果保存下來(lái)。該宏定義的啞元應(yīng)
為數(shù)組首址ARRAY,數(shù)組長(zhǎng)度COUNT和結(jié)果存放單元RESULT。
答:宏定義如下:
SUMMING MACRO ARRAY,COUNT,RESULT
LOCAL ADDITION
MOV ESI, 0
MOV ECX, COUNT
ADDITION: MOV EAX, ARRAY[ESI*4] ;;雙字為4字節(jié)
ADD RESULT, EAX
ADC RESULT+4, 0 ;;將進(jìn)位加到結(jié)果的高位雙字中
INC ESI
LOOP ADDITION
ENDM
7.17 為下列數(shù)據(jù)段中的數(shù)組編制一程序,調(diào)用題7.16的宏定義SUMMING,求出該數(shù)組中各元素之和。
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字節(jié)
ADD RESULT, EAX
ADC RESULT+4, 0 ;;將進(jìn)位加到結(jié)果的高位雙字中
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中的宏定義存放在一個(gè)宏庫(kù)中,則題7.17的程序應(yīng)如何修改?
答:程序修改如下:
INCLUDE MACRO.MAC ;假設(shè)存放的宏庫(kù)名為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
總結(jié)
以上是生活随笔為你收集整理的《IBM-PC汇编语言程序设计》(第2版)【沈美明 温冬婵】——第七章——自编解析与答案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《IBM-PC汇编语言程序设计》(第2版
- 下一篇: 《IBM-PC汇编语言程序设计》(第2版