IBM-PC汇编语言程序设计答案(第2版) 下载本文

答:(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