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,完成输出空行的功能。空出的行数在AX寄存器中。
答:程序如下:
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版)【沈美明 温冬婵】——第六章——自编解析与答案相关推荐

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

    2.1 在80x86微机的输入/输出指令中,I/O端口号通常是由DX寄存器提供的,但有时也可以在指令中直接指定00~FFH的端口号.试问可直接由指令指定的I/O端口数. 解析: P31-2.5 外部设 ...

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

    1.1 用降幂法和除法将下列十进制数转换为二进制数和十六进制数: (1) 369   (2) 10000   (3) 4095   (4) 32767 解析: P4-1.1.3 十六进制数及其与二进制 ...

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

    10.1 写出指令,选择显示方式10H,并将背景设为绿色. 答: MOV AH, 00H MOV AL, 10H :选择显示方式10H(16色图形) INT 10H MOV AH, 10H MOV A ...

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

    8.1 写出分配给下列中断类型号在中断向量表中的物理地址. (1) INT 12H (2) INT 8 答:(1) 中断类型号12H在中断向量表中的物理地址为00048H.00049H.0004AH. ...

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

    <IBM-PC汇编语言程序设计>(第2版)[沈美明 温冬婵]--第一章--自编解析与答案 <IBM-PC汇编语言程序设计>(第2版)[沈美明 温冬婵]--第二章--自编解析与答 ...

  6. 《IBM-PC汇编语言程序设计》(第2版)【沈美明 温冬婵】答案

    内容修订.解析.扩展: <IBM-PC汇编语言程序设计>(第2版)[沈美明 温冬婵]--自编解析与答案 第 一 章. 习 题 1.1 用降幂法和除法将下列十进制数转换为二进制数和十六进制数 ...

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

    11.1 写出文件代号式磁盘存取操作的错误代码: (1) 非法文件代号 (2) 路径未发现 (3) 写保护磁盘 答:错误代码为: (1) 06 (2) 03 (4) 19 11.2 使用3CH功能建立 ...

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

    5.1 试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来. 答:程序段如下: BEGIN: MOV AH, 1 :从键盘输入一个字符的DOS调用 INT 21H CMP AL, 'a ...

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

    3.1 给定(BX)=637DH,(SI)=2A9BH,位移量D=7237H,试确定在以下各种寻址方式下的有效地址是什么? (1) 立即寻址 (2) 直接寻址 (3) 使用BX的寄存器寻址 (4) 使 ...

最新文章

  1. mysql innodb表分区
  2. CentOS8更换源后失败问题
  3. POST 变为AJAX提交代码。
  4. python爬虫采集网站数据
  5. 三个世界及其有关概念
  6. VX的这一重大变化,你支持嘛?
  7. 案例分析:你造吗?有个ORA-60死锁的解决方案
  8. 【目标检测】NMS和soft-NMS详解及代码实现
  9. HTML参考系列(1)-文本格式化标签
  10. PouchContainer 开源版本及内部版本一致性实践
  11. Mysql中索引的 创建,查看,删除,修改
  12. 安全合规/法案--35--《APP收集使用个人信息自评估指南(征求意见稿)》原文及解读
  13. Python学习002—python的安装以及pip
  14. Kent Beck : 领导的敏捷潮
  15. antv图例出现分页_自定义图例组件
  16. 小红书种草模式有哪些?如何保证种草效果
  17. 集成讯飞离线语音合成SDK报:“ 未经授权的语音应用.(错误码:11210)“ 问题解决
  18. 255字符c语言中,在单片机C语言程序设计中,______类型数据经常用于处理ASCⅡ字符或处理小于等于255的整型数 答案:char...
  19. hysVideoQC v0.0.2.002版本发布
  20. opic4:Qt入门之常用qt控件认知之Button系列

热门文章

  1. 内存条ar开头的如何看大小_软网推荐:明明白白看内存
  2. android webview 重定向 多次load问题,解决webview 第二次调用loadUrl页面不刷新的问题...
  3. bugzilla perl mysql apache windows,windows下apache安装bugzilla
  4. android调用webservice传参数,android调用webservice接口获取信息
  5. python续行_python基础(变量,续行符,is,round,if,字符串,日期,数学,参数)...
  6. android SharedPreferences设置初始密码,并修改密码
  7. 【小白学习C++ 教程】二十二、C++ 中的STL容器stack、queue和map
  8. 四十六、深入Java的网络编程(下篇)
  9. 影评情感分类(基于IMDB数据集)
  10. rabbitmq队列php应用,RabbitMQ工作队列应用