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