日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

《IBM-PC汇编语言程序设计》(第2版)【沈美明 温冬婵】——第六章——自编解析与答案

發布時間:2024/10/5 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《IBM-PC汇编语言程序设计》(第2版)【沈美明 温冬婵】——第六章——自编解析与答案 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

6.1 下面的程序段有錯嗎?若有,請指出錯誤。
CRAY PROC
PUSH AX
ADD AX, BX
RET
ENDP CRAY
答:程序有錯。改正如下:
CRAY PROC
ADD AX, BX
RET
CRAY ENDP ;CRAY是過程名,應放在ENDP的前面
6.2 已知堆棧寄存器SS的內容是0F0A0H,堆棧指示器SP的內容是00B0H,先執行兩條把8057H和0F79BH分別
入棧的PUSH指令,然后執行一條POP指令。試畫出示意圖說明堆棧及SP內容的變化過程。
答:變化過程如右圖所示:
6.3 分析下面的程序,畫出堆棧最滿時各單元的地址及內容。
;********************************************
S_SEG SEGMENT AT 1000H ;定義堆棧段
DW 200 DUP (?) ;200*2=190H
TOS LABEL WORD
S_SEG ENDS

;********************************************
C_SEG SEGMENT ;定義代碼段
ASSUME CS: C_SEG, SS: S_SEG
START: MOV AX, S_SEG
MOV SS, AX
MOV SP, OFFSET TOS
PUSH DS
MOV AX, 0
PUSH AX

PUSH T_ADDR
PUSH AX
PUSHF

POPF
POP AX
POP T_ADDR
RET
;--------------------------------------------------------------------------
C_SEG ENDS ;代碼段結束
;******************************************
END START ;程序結束
答:堆棧最滿時各單元的地址及內容如右圖所示:
6.4 分析下面的程序,寫出堆棧最滿時各單元的地址及內容。
;********************************************
STACK SEGMENT AT 500H ;定義堆棧段
DW 128 DUP (?)
TOS LABEL WORD

STACK ENDS
;********************************************
CODE SEGMENT ;定義代碼段
MAIN PROC FAR ;主程序部分
ASSUME CS: CODE, SS: STACK
START: MOV AX, STACK
MOV SS, AX
MOV SP, OFFSET TOS
PUSH DS
SUB AX, AX
PUSH AX
;MAIN PART OF PROGRAM GOES HERE
MOV AX, 4321H
CALL HTOA
RET
MAIN ENDP ;主程序部分結束
;--------------------------------------------------------------------
HTOA PROC NEAR ;HTOA子程序
CMP AX, 15
JLE B1
PUSH AX
PUSH BP
MOV BP, SP
MOV BX, [BP+2]
AND BX, 000FH
MOV [BP+2], BX
POP BP
MOV CL, 4
SHR AX, CL

CALL HTOA
POP BP
B1: ADD AL, 30H
CMP AL, 3AH
JL PRINTIT
ADD AL, 7H
PRINTIT: MOV DL, AL
MOV AH, 2
INT 21H
RET
HOTA ENDP ;HOTA子程序結束
;--------------------------------------------------------------------
CODE ENDS ;代碼段結束
;******************************************
END START ;程序結束
答:堆棧最滿時各單元的地址及內容如右上圖所示:
6.5 下面是一個程序清單,請在下面的圖中填入此程序執行過程中的堆棧變化。
;*************************
0000 STACKSG SEGMENT
0000 20 [. DW 32 DUP (?)
? ? ? ?
]
0040 STACKSG ENDS
;*************************
0000 CODESG SEGMENT PARA ‘CODE’
;--------------------------------------
0000 BEGIN PROC FAR
ASSUME CS: CODESG, SS: STACKSG
0000 1E PUSH DS

0001 2B C0 SUB AX, AX
0003 50 PUSH AX
0004 E8 0008 R CALL B10
;--------------------------------------
0007 CB RET
0008 BEGIN ENDP
;--------------------------------------
0008 B10 PROC
0008 E8 000C R CALL C10
;--------------------------------------
000B C3 RET
000C B10 ENDP
;--------------------------------------
000C C10 PROC
;--------------------------------------
000C C3 RET
000D C10 ENDP
;--------------------------------------
000D CODESG ENDS
;*************************
END BEGIN
答:程序執行過程中的堆棧變化如下圖所示。
6.6 寫一段子程序SKIPLINES,完成輸出空行的功能??粘龅男袛翟贏X寄存器中。
答:程序如下:
CSEG SEGMENT
SKIPLINES PROC FAR
ASSUME CS: CSEG
BEGIN: PUSH CX
PUSH DX

MOV CX, AX
DISP: MOV DL, 0DH ;顯示回車換行,即輸出空行
MOV AH, 2 ;顯示一個字符的DOS調用
INT 21H
MOV DL, 0AH
MOV AH, 2 ;顯示一個字符的DOS調用
INT 21H
LOOP DISP
POP DX
POP CX
RET
SKIPLINES ENDP
END
6.7 設有10個學生的成績分別是76,69,84,90,73,88,99,63,100和80分。試編制一個子程序統計
60~69分,70~79分,80~89分,90~99分和100分的人數,分別存放到S6,S7,S8,S9和S10單元中。
答:程序如下:
DSEG SEGMENT
RECORD DW 76,69,84,90,73,88,99,63,100,80
S6 DW 0
S7 DW 0
S8 DW 0
S9 DW 0
S10 DW 0
DSEG ENDS
;******************************************
CSEG SEGMENT
MAIN PROC FAR
ASSUME CS: CSEG, DS: DSEG
START: PUSH DS ;設置返回DOS

SUB AX, AX
PUSH AX
MOV AX, DSEG
MOV DS, AX ;給DS賦值
BEGIN: MOV CX, 10
CALL COUNT
┇ ;后續程序
RET
MAIN ENDP
;--------------------------------------------------------------------------
COUNT PROC NEAR ;成績統計子程序
MOV SI, 0
NEXT: MOV AX, RECORD[SI]
MOV BX, 10 ;以下5句是根據成績計算相對S6的地址變化量
DIV BL ;計算公式為:((成績)/10-6)*2送(BX)
MOV BL, AL ;此時(BH)保持為0不變
SUB BX, 6 ;應為只統計60分以上成績
SAL BX, 1 ;(BX)*2
INC S6[BX] ;S6是S6,S7,S8,S9和S10單元的首地址
ADD SI, 2
LOOP NEXT
RET
COUNT ENDP ;COUNT子程序結束
;--------------------------------------------------------------------------
CSEG ENDS ;以上定義代碼段
;******************************************
END START
6.8 編寫一個有主程序和子程序結構的程序模塊。子程序的參數是一個N字節數組的首地址TABLE,數N及

字符CHAR。要求在N字節數組中查找字符CHAR,并記錄該字符出現的次數。主程序則要求從鍵盤接收一串字符
以建立字節數組TABLE,并逐個顯示從鍵盤輸入的每個字符CHAR以及它在TABLE數組中出現的次數。(為簡化起
見,假設出現次數≤15,可以用16進制形式把它顯示出來。)
答:程序如下:
DSEG SEGMENT
TABLE DB 255 DUP (?)
N DW 255
CHAR DB ?
CHAR_N DB 0 ;用于記錄CHAR出現的次數
CRLF DB 0DH, 0AH, ‘$’
DSEG ENDS ;以上定義數據段
;******************************************
STACK SEGMENT
DW 100 DUP (?)
TOS LABEL WORD
STACK ENDS ;以上定義堆棧段
;******************************************
CSEG SEGMENT
MAIN PROC FAR
ASSUME CS: CSEG, DS: DSEG, SS: STACK
START: MOV AX, STACK
MOV SS, AX ;給SS賦值
MOV SP, OFFSET TOS ;給SP賦值
PUSH DS ;設置返回DOS
SUB AX, AX
PUSH AX
MOV AX, DSEG
MOV DS, AX ;給DS賦值

BEGIN: MOV BX, 0
MOV CX, 255 ;最多輸入255個字符
INPUT: MOV AH, 1 ;從鍵盤接收一個字符的DOS功能調用
INT 21H
CMP AL, 0DH ;輸入回車符結束輸入
JZ IN_N
MOV TABLE [BX], AL
INC BX
LOOP INPUT
IN_N: MOV N, BX ;TABLE數組中的字符個數送N
CALL DISP_CRLF
IN_CHAR: MOV AH, 1 ;從鍵盤接收一個字符并回顯的DOS功能調用
INT 21H
CMP AL, 0DH ;輸入回車符結束
JZ EXIT
MOV CHAR, AL ;輸入的字符存入CHAR單元
CALL SEARCH ;調搜索字符子程序
MOV DL, ‘:’ ;顯示“:”,在字符CHAR(輸入時回顯)的后面
MOV AH, 2 ;顯示一個字符
INT 21H
MOV DL, CHAR_N ;再顯示CHAR出現的次數(次數≤15)
AND DL, 0FH
ADD DL, 30H
CMP DL, 39H
JBE NEXT
ADD DL, 07H ;是A~F
NEXT: MOV AH, 2 ;顯示一個字符
INT 21H
CALL DISP_CRLF

JMP SHORT IN_CHAR
EXIT: RET
MAIN ENDP
;--------------------------------------------------------------------------
SEARCH PROC NEAR ;搜索字符子程序
MOV SI, 0
MOV CX, N
MOV CHAR_N, 0
MOV AL, CHAR
ROTATE: CMP AL, TABLE [SI]
JNZ ROTATE1
INC CHAR_N ;搜索到字符,則出現次數+1
ROTATE1: INC SI
LOOP ROTATE
RET
SEARCH ENDP ;SEARCH子程序結束
;--------------------------------------------------------------------------
DISP_CRLF PROC NEAR ;顯示回車換行符子程序
LEA DX, CRLF
MOV AH, 09H
INT 21H
RET
DISP_CRLF ENDP ;DISP_CRLF子程序結束
;--------------------------------------------------------------------------
CSEG ENDS ;以上定義代碼段
;******************************************
END START
6.9 編寫一個子程序嵌套結構的程序模塊,分別從鍵盤輸入姓名及8個字符的電話號碼,并以一定的格式
顯示出來。

主程序TELIST:
? 顯示提示符“INPUT NAME:”;
? 調用子程序INPUT_NAME輸入姓名;
? 顯示提示符“INPUT A TELEPHONE NUMBER:”;
? 調用子程序INPHONE輸入電話號碼;
? 調用子程序PRINTLINE顯示姓名及電話號碼。
子程序INPUT_NAME:
? 調用鍵盤輸入子程序GETCHAR,把輸入的姓名存放在INBUF緩沖區中;
? 把INBUF中的姓名移入輸出行OUTNAME。
子程序INPHONE:
? 調用鍵盤輸入子程序GETCHAR,把輸入的8位電話號碼存放在INBUF緩沖區中;
? 把INBUF中的號碼移入輸出行OUTPHONE。
子程序PRINTLINE:
顯示姓名及電話號碼,格式為:
NAME TEL.
X X X XXXXXXXX
答:程序如下:
DSEG SEGMENT
INBUF DB 12 DUP (‘ ’) ;輸入緩沖區,初始值為空格
OUTNAME DB 16 DUP (‘ ’), ;姓名輸出行,初始值為空格
OUTPHONE DB 12 DUP (‘ ’), 0DH, 0AH, ‘$’ ;號碼輸出行,初始值為空格
MESG1 DB ‘INPUT NAME:’, ‘$’
MESG2 DB ‘INPUT A TELEPHONE NUMBER:’, ‘$’
MESG3 DB ‘NAME’, 12 DUP (‘ ’), ‘TEL.’, 0DH, 0AH, ‘$’
CRLF DB 0DH, 0AH, ‘$’
DSEG ENDS ;以上定義數據段
;******************************************
STACK SEGMENT
DW 100 DUP (?)

TOS LABEL WORD
STACK ENDS ;以上定義堆棧段
;******************************************
CSEG SEGMENT
TELIST PROC FAR ;主程序TELIST
ASSUME CS: CSEG, DS: DSEG, ES: DSEG, SS: STACK
START: MOV AX, STACK
MOV SS, AX ;給SS賦值
MOV SP, OFFSET TOS ;給SP賦值
PUSH DS ;設置返回DOS
SUB AX, AX
PUSH AX
MOV AX, DSEG
MOV DS, AX ;給DS賦值
MOV ES, AX ;給ES賦值
BEGIN: LEA DX, MESG1
MOV AH, 09H ;顯示字符串功能調用
INT 21H
CALL INPUT_NAME ;輸入姓名
LEA DX, MESG2
MOV AH, 09H ;顯示字符串功能調用
INT 21H
CALL INPHONE ;輸入電話號碼
CALL PRINTLINE ;顯示姓名及電話號碼
RET
TELIST ENDP
;--------------------------------------------------------------------------
INPUT_NAME PROC NEAR ;輸入姓名子程序

CALL GETCHAR ;調輸入字符子程序輸入姓名
LEA SI, INBUF ;把INBUF中的姓名移入輸出行OUTNAME
LEA DI, OUTNAME
MOV CX, 12
CLD
REP MOVSB
RET
INPUT_NAME ENDP ;INPUT_NAME子程序結束
;--------------------------------------------------------------------------
INPHONE PROC NEAR ;輸入電話號碼子程序
CALL GETCHAR ;調輸入字符子程序輸入電話號碼
LEA SI, INBUF ;把INBUF中的電話號碼移入輸出行OUTPHONE
LEA DI, OUTPHONE
MOV CX, 12
CLD
REP MOVSB
RET
INPHONE ENDP ;INPHONE子程序結束
;--------------------------------------------------------------------------
GETCHAR PROC NEAR ;鍵盤輸入子程序
MOV AL, 20H ;先將INBUF中填滿空格字符
MOV CX, 12
LEA DI, INBUF
CLD
REP STOSB
MOV CX, 12 ;向INBUF輸入字符
MOV DI, 0
INPUT: MOV AH, 1 ;從鍵盤接收一個字符并回顯的DOS功能調用
INT 21H

CMP AL, 0DH ;輸入回車符返回
JZ QUIT
MOV INBUF[DI], AL
INC DI
LOOP INPUT
QUIT: CALL DISP_CRLF
RET
GETCHAR ENDP ;GETCHAR子程序結束
;--------------------------------------------------------------------------
PRINTLINE PROC NEAR ;顯示姓名及電話號碼子程序
LEA DX, MESG3
MOV AH, 09H ;顯示字符串功能調用
INT 21H
LEA DX, OUTNAME ;顯示姓名及電話號碼
MOV AH, 09H ;顯示字符串功能調用
INT 21H
RET
PRINTLINE ENDP ;PRINTLINE子程序結束
;--------------------------------------------------------------------------
DISP_CRLF PROC NEAR ;顯示回車換行符子程序
LEA DX, CRLF
MOV AH, 09H
INT 21H
RET
DISP_CRLF ENDP ;DISP_CRLF子程序結束
;--------------------------------------------------------------------------
CSEG ENDS ;以上定義代碼段
;******************************************
END START

6.10 編寫子程序嵌套結構的程序,把整數分別用二進制和八進制形式顯示出來。
主程序BANDO:把整數字變量VAL1存入堆棧,并調用子程序PAIRS;
子程序PAIRS:從堆棧中取出VAL1;調用二進制顯示程序OUTBIN顯示出與其等效的二進制數;輸出8個空格;調
用八進制顯示程序OUTOCT顯示出與其等效的八進制數;調用輸出回車及換行符子程序。
答:程序如下:
DSEG SEGMENT
VAL1 DW ?
CRLF DB 0DH, 0AH, ‘$’
DSEG ENDS ;以上定義數據段
;******************************************
CSEG SEGMENT
BANDO PROC FAR ;主程序BANDO
ASSUME CS: CSEG, DS: DSEG
START: PUSH DS ;設置返回DOS
SUB AX, AX
PUSH AX
MOV AX, DSEG
MOV DS, AX ;給DS賦值
PUSH VAL1
CALL PAIRS
RET
BANDO ENDP
;--------------------------------------------------------------------------
PAIRS PROC NEAR ;PAIRS子程序
PUSH BP
MOV BP, SP
PUSH BX
MOV BX, [BP+4] ;從堆棧中取出VAL1

CALL OUTBIN ;調用二進制顯示子程序
MOV CX, 8 ;顯示8個空格符
SPACE: MOV DL, ‘ ’
MOV AH, 2
INT 21H
LOOP SPACE
CALL OUTOCT ;調用八進制顯示子程序
CALL DISP_CRLF
POP BX
POP BP
RET 2
PAIRS ENDP ;PAIRS子程序結束
;--------------------------------------------------------------------------
OUTBIN PROC NEAR ;二進制顯示子程序
PUSH BX
MOV CX, 16
ONEBIT: ROL BX, 1
MOV DX, BX
AND DX, 1
OR DL, 30H ;轉換為ASCII碼
MOV AH, 2
INT 21H
LOOP ONEBIT
POP BX
RET
OUTBIN ENDP ;OUTBIN子程序結束
;--------------------------------------------------------------------------
OUTOCT PROC NEAR ;八進制顯示子程序
ROL BX, 1 ;16位二進制數包含6位八進制數,最高位僅1位

MOV DX, BX
AND DX, 1
OR DL, 30H ;轉換為ASCII碼
MOV AH, 2
INT 21H
MOV CX, 5 ;余下還有5位八進制數
NEXT: PUSH CX
MOV CL, 3 ;1位八進制數包含3位二進制數
ROL BX, CL
MOV DX, BX
AND DX, 07H
OR DL, 30H ;轉換為ASCII碼
MOV AH, 2
INT 21H
POP CX
LOOP NEXT
RET
OUTOCT ENDP ;OUTOCT子程序結束
;--------------------------------------------------------------------------
DISP_CRLF PROC NEAR ;顯示回車換行符子程序
LEA DX, CRLF
MOV AH, 09H
INT 21H
RET
DISP_CRLF ENDP ;DISP_CRLF子程序結束
;--------------------------------------------------------------------------
CSEG ENDS ;以上定義代碼段
;******************************************
END START

6.11 假定一個名為MAINPRO的程序要調用子程序SUBPRO,試問:
(1) MAINPRO中的什么指令告訴匯編程序SUBPRO是在外部定義的?
(2) SUBPRO怎么知道MAINPRO要調用它?
答:(1) EXTRN SUBPRO:FAR
(2) PUBLIC SUBPRO
6.12 假定程序MAINPRO和SUBPRO不在同一模塊中,MAINPRO中定義字節變量QTY和字變量VALUE和
PRICE。SUBPRO程序要把VALUE除以QTY,并把商存在PRICE中。試問:
(1) MAINPRO怎么告訴匯編程序外部子程序要調用這三個變量?
(2) SUBPRO怎么告訴匯編程序這三個變量是在另一個匯編語言程序定義的?
答:(1) PUBLIC QTY, VALUE, PRICE
(2) EXTRN QTY:BYTE, VALUE:WORD, PRICE:WORD
6.13 假設:
(1) 在模塊1中定義了雙字變量VAR1,首地址為VAR2的字節數據和NEAR標號LAB1,它們將由模塊2和模塊3所使
用;
(2) 在模塊2中定義了字變量VAR3和FAR標號LAB2,而模塊1中要用到VAR3,模塊3中要用到LAB2;
(3) 在模塊3中定義了FAR標號LAB3,而模塊2中要用到它。
試對每個源模塊給出必要的EXTRN和PUBLIC說明。
答:模塊1:
EXTRN VAR3: WORD
PUBLIC VAR1,VAR2,LAB1
模塊2:
EXTRN VAR1: DWORD,VAR2: BYTE,LAB1: NEAR,LAB3: FAR
PUBLIC VAR3,LAB2
模塊3:
EXTRN VAR1: DWORD,VAR2: BYTE,LAB1: NEAR,LAB2: FAR
PUBLIC LAB3
6.14 主程序CALLMUL定義堆棧段、數據段和代碼段,并把段寄存器初始化,數據段中定義變量QTY和
PRICE;代碼段中將PRICE裝入AX,QTY裝入BX,然后調用子程序SUBMUL。程序SUBMUL沒有定義任何數據,它只
簡單地把AX中的內容(PRICE)乘以BX中的內容(QTY),乘積放在DX: AX中。請編制這兩個要連接起來的程序。

答:程序如下:
TITLE CALLMUL ;主程序
EXTRN SUBMUL: FAR
;-----------------------------------------------------------------
STACK SEGMENT PARA STACK ‘STACK’
DW 64 DUP (?)
TOS LABEL WORD
STACK ENDS
;--------------------------------------------------------------
DATASG SEGMENT PARA ‘DATA’
QTY DW 0140H
PRICE DW 2500H
DATASG ENDS
;--------------------------------------------------------------
CODESG SEGMENT PARA ‘CODE’
CALLMUL PROC FAR
ASSUME CS: CODESG, DS: DATASG, SS: STACK
START: MOV AX, STACK
MOV SS, AX ;給SS賦值
MOV SP, OFFSET TOS ;給SP賦值
PUSH DS
SUB AX, AX
POP AX
MOV AX, DATASG
MOV DS, AX
MOV AX, PRICE
MOV BX, QTY
CALL SUBMUL

RET
CALLMUL ENDP
CODESG ENDS
;-----------------------------------------------------------------
END CALLMUL
;***************************************************************
TITLE SUBMUL ;子程序
PUBLIC SUBMUL
;-----------------------------------------------------------------
CODESG1 SEGMENT PARA ‘CODE’
ASSUME CS: CODESG1
SUBMUL PROC FAR
ASSUME CS: CODESG1
MUL BX
RET
SUBMUL ENDP
CODESG1 ENDS
;-----------------------------------------------------------------
END
6.15 試編寫一個執行以下計算的子程序COMPUTE:
R ← X + Y - 3
其中X,Y及R均為字數組。假設COMPUTE與其調用程序都在同一代碼段中,數據段D_SEG中包含X和Y數組,數據
段E_SEG中包含R數組,同時寫出主程序調用COMPUTE過程的部分。
如果主程序和COMPUTE在同一程序模塊中,但不在同一代碼段中,程序應如何修改?
如果主程序和COMPUTE不在同一程序模塊中,程序應如何修改?
答:(1) 主程序和COMPUTE在同一代碼段中的程序如下:
TITLE ADDITION ;主程序
;--------------------------------------------------------------
D_SEG SEGMENT PARA ‘DATA’

COUNT EQU 10H
X DW COUNT DUP (?)
Y DW COUNT DUP (?)
D_SEG ENDS
;--------------------------------------------------------------
E_SEG SEGMENT PARA ‘DATA’
R DW COUNT DUP (?)
E_SEG ENDS
;--------------------------------------------------------------
C_SEG SEGMENT PARA ‘CODE’
ADDITION PROC FAR
ASSUME CS: C_SEG, DS: D_SEG, ES: E_SEG
START: PUSH DS
SUB AX, AX
PUSH AX
MOV AX, D_SEG
MOV DS, AX
MOV AX, E_SEG
MOV ES, AX
CALL COMPUTE ;調用求和子程序
RET
ADDITION ENDP
;********************************************
COMPUTE PROC NEAR ;同一段的求和子程序
MOV CX, COUNT
MOV BX, 0
REPEAT: MOV AX, X[BX]
ADD AX, Y[BX]
SUB AX, 3

MOV ES: R[BX], AX
RET
COMPUTE ENDP
;-----------------------------------------------------------------
C_SEG ENDS
;*******************************************
END START
(2) 主程序和COMPUTE在同一程序模塊中,但不在同一代碼段中的程序如下:
TITLE ADDITION ;主程序
;--------------------------------------------------------------
D_SEG SEGMENT PARA ‘DATA’
COUNT EQU 10H
X DW COUNT DUP (?)
Y DW COUNT DUP (?)
D_SEG ENDS
;--------------------------------------------------------------
E_SEG SEGMENT PARA ‘DATA’
R DW COUNT DUP (?)
E_SEG ENDS
;--------------------------------------------------------------
C_SEG SEGMENT PARA ‘CODE’
ADDITION PROC FAR
ASSUME CS: C_SEG, DS: D_SEG, ES: E_SEG
START: PUSH DS
SUB AX, AX
POP AX
MOV AX, D_SEG
MOV DS, AX
MOV AX, E_SEG

MOV ES, AX
CALL FAR PTR COMPUTE ;調用求和子程序
RET
ADDITION ENDP
C_SEG ENDS
;********************************************
CODESG SEGMENT PARA ‘CODE’
ASSUME CS: CODESG
COMPUTE PROC FAR ;不同段的求和子程序
MOV CX, COUNT
MOV BX, 0
REPEAT: MOV AX, X[BX]
ADD AX, Y[BX]
SUB AX, 3
MOV ES: R[BX], AX
RET
COMPUTE ENDP
;-----------------------------------------------------------------
CODESG ENDS
;********************************************
END START
(3) 主程序和COMPUTE不在同一程序模塊中的程序如下:
TITLE ADDITION ;主程序
EXTRN COMPUTE: FAR
PUBLIC COUNT, X, Y, R
;--------------------------------------------------------------
D_SEG SEGMENT PARA ‘DATA’
COUNT DW 10H
X DW 10H DUP (?)

Y DW 10H DUP (?)
D_SEG ENDS
;--------------------------------------------------------------
E_SEG SEGMENT PARA ‘DATA’
R DW 10H DUP (?)
E_SEG ENDS
;--------------------------------------------------------------
C_SEG SEGMENT PARA ‘CODE’
ADDITION PROC FAR
ASSUME CS: C_SEG, DS: D_SEG, ES: E_SEG
START: PUSH DS
SUB AX, AX
POP AX
MOV AX, D_SEG
MOV DS, AX
MOV AX, E_SEG
MOV ES, AX
CALL FAR PTR COMPUTE ;調用求和子程序
RET
ADDITION ENDP
C_SEG ENDS
;-----------------------------------------------------------------
END START
;***************************************************************
TITLE COMPUTE ;求和子程序
EXTRN COUNT:WORD, X:WORD, Y:WORD, R:WORD
PUBLIC COMPUTE
;-----------------------------------------------------------------

CODESG SEGMENT PARA ‘CODE’
ASSUME CS: CODESG
COMPUTE PROC FAR ;不同模塊的求和子程序
MOV CX, COUNT
MOV BX, 0
REPEAT: MOV AX, X[BX]
ADD AX, Y[BX]
SUB AX, 3
MOV ES: R[BX], AX
RET
COMPUTE ENDP
;-----------------------------------------------------------------
CODESG ENDS
;********************************************
END

?

參考文章

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版)【沈美明 温冬婵】——第六章——自编解析与答案的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。