汇编语言第六章答案
下面的程序段有错吗若有,请指出错误。
CRAY PROC
PUSH AX
ADD AX, BX
RET
ENDP CRAY
答:程序有错。改正如下:
CRAY PROC
ADD AX, BX
RET
CRAY ENDP ;CRAY是过程名,应放在ENDP的前面
9BH
F7H
57H
80H
F0A0:00B0H
先PUSH,SP-2
再PUSH,SP-2
POP, SP+2
题堆栈及SP内容的变化过程
已知堆栈寄存器SS的内容是0F0A0H,堆栈指示器SP的内容是00B0H,先执行两条把8057H 和0F79BH分别入栈的PUSH指令,然后执行一条POP指令。试画出示意图说明堆栈及SP内容的变化过程。
答:变化过程如右图所示:
分析下面的程序,画出堆栈最满时各单元的地址及内容。
;********************************************
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
(FLAGS)
(AX)
T_ADDR
0000
(DS)
1000:0184
:0186
:0188
:018A
:018C
:018E
SP:
0186
题堆栈最满时各单元的地址及内容
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 ;程序结束
答:堆栈最满时各单元的地址及内容如右图所示:
分析下面的程序,写出堆栈最满时各单元的地址及内容。;******************************************** 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 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
0500:00EC
:00EE
:00F0
:00F2
:00F4
:00F6
:00F8
:00FA
:00FC
:00FE
SP:
00EE
返回POP BP地址
0003H
返回POP BP地址
0002H
返回POP BP地址
0001H
主程序返回地址
0000
(DS)
题堆栈最满时各单元的地址及内容
PUSH BP
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 ;程序结束
答:堆栈最满时各单元的地址及内容如右上图所示:
下面是一个程序清单,请在下面的图中填入此程序执行过程中的堆栈变化。;*************************
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
答:程序执行过程中的堆栈变化如下图所示。
( 0016H )
( 0018H )
( 001AH )
( 001CH )
( 001EH )
( 0020H )
SP:
(DS)
( 0016H )
( 0018H )
( 001AH )
( 001CH )
( 001EH )
( 0020H )
0000
(DS)
( 0016H )
( 0018H )
( 001AH )
( 001CH )
( 001EH )
( 0020H )
0007 0000 (DS)
0020H
001EH
001CH
001AH
( 0016H ) ( 0018H ) ( 001AH ) ( 001CH ) ( 001EH ) ( 0020H )
000B 0007 0000 (DS)
( 0016H ) ( 0018H ) ( 001AH ) ( 001CH ) ( 001EH ) ( 0020H ) SP:
000B 0007 0000 (DS)
( 0016H ) ( 0018H ) ( 001AH )
( 001CH )
( 001EH )
( 0020H )
000B
0007
0000
(DS)
( 0016H )
( 0018H )
( 001AH )
( 001CH )
( 001EH )
( 0020H )
000B
0007
0000
(DS)
0018H
001AH
001CH
0020H
( 0016H )
( 0018H )
( 001AH )
( 001CH )
( 001EH )
( 0020H )
BEGIN PUSH DS PUSH AX CALL B10 偏移地址堆栈
写一段子程序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
设有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
编写一个有主程序和子程序结构的程序模块。子程序的参数是一个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出现的次数
CR LF 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
编写一个子程序嵌套结构的程序模块,分别从键盘输入姓名及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
编写子程序嵌套结构的程序,把整数分别用二进制和八进制形式显示出来。
主程序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
假定一个名为MAINPRO的程序要调用子程序SUBPRO,试问:
(1) MAINPRO中的什么指令告诉汇编程序SUBPRO是在外部定义的
(2) SUBPRO怎么知道MAINPRO要调用它
答:(1) EXTRN SUBPRO:FAR
(2) PUBLIC SUBPRO
假定程序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
假设:
(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
主程序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
试编写一个执行以下计算的子程序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
;********************************************
汇编语言第六章 输入输出和中断
第六章输入/输出和中断 前面已经讲过有关输入/输出的问题,主要是用DOS中断调用INT 21H来完成键盘输入以及屏幕显示。对于计算机来说,仅有这种输入/输出还不够,因为DOS的中断调用无法实现对其它外设的控制。关于如何用汇编程序实现主机与外设之间的信息交换,将是本章的主要内容。 6.1I/O设备与数据传送方式 一.主机与外设之间数据的传送方式 计算机与外设之间传送数据有如下4中方式: 1.无条件传送方式:适合于CPU与外设同步的情况。直接传送,高速外设与主机之间数据传送。 2.查询传送方式:适合于低速外设与主机之间数据传送。 3.中断传送方式:适合于低速外设与主机之间数据传送。 4.直接存贮器(又称DMA)传送方式:适合于高速外存与主机的数据传送。 其中:无条件传送和查询传送,直接在端口上利用IN和OUT 指令传送数据。 中断传送:在DOS及BIOS层上通过系统功能调用的中断指令实现。
直接存贮方式:在端口上,采用通道技术实现。在计算机准备好接收,外设准备好传送数据时,外设向CPU发一个请求DMA传送信号,此时CPU让出总线控制权,使外设与主存在短时间内成批传送数据。 二.外设与主机传送的接口与信息 1.端口与接口 计算机的外设都是通过接口连接到系统上,每个接口由一组寄存器组成,寄存器都有一个称为I/O端口的地址编码。 也就是,每一台外设都通过硬件接口与主机端口相连,并交换信息。 接口的组成:设备状态寄存器、设备控制寄存器、数据寄存器。上述寄存器在I/O空间中都有固定编码。 I/O端口的地址空间:允许设置64K个8位端口或32K个16位端口。对I/O空间的访问用IN或OUT两个指令。 I/O端口地址分配,可以查手册。 如:40H~43H时钟/定时器,60H~63H为8255通讯芯片的接口。 2.外设与主机的信息交换
最新有答案---14-15-1-汇编语言复习资料
汇编语言复习资料 第一部分选择题 第一章基础知识 1.数组array在数据段的定义如下所示,在内存空间的存储值是什么,选出正确的一 项(B ) array db 1,‘1’,0AH,‘A’,-2 A、1H 1H 0AH 0AH 82h B、1H 31H 0AH 41H FEH C、1 1 0A 0A 12h D、31H 31H 41H 41H 02h 2.debug命令中显示内存单元内容的命令是( B ) A、a B、d C、e D、r 3.debug命令中反汇编命令是(D ) A、q B、g C、t D、u 4.在DEBUG下,修改寄存器AX的命令是___B_。 A.U AX B.R AX C.R D.A AX 5.从200H开始反汇编的DEBUG命令是A____。 A.U 200 B.R 200 C.D 200 D.U 6.仅查看用户程序中数据段10号存储单元的DEBUG命令是A____。 A.D DS:A A B.D DS:A C.D DS:10 10 D.D DS:10 7.计算机编程语言的发展顺序是(A ) A、机器语言汇编语言高级语言 B、汇编语言机器语言高级语言 C、高级语言汇编语言机器语言 D、高级语言机器语言汇编语言 8.将124转换成十六进制数的结果是_A____。 A.7CH B.7DH C.7EH D.7BH 9.计算机对字符、符号采用统一的二进制编码。其编码采用的是_C_____。 A.BCD码B.二进制码C.ASCII D.十六进制码 第二章80x86计算机组织 10.对汇编语言源程序进行翻译的程序是__B___。 A.连接程序B.汇编程序C.编译程序D.目标程序 11.在汇编语言中,能够翻译成二进制代码的指令是__A__。 A.汇编指令B.伪指令C.机器指令D.宏指令
汇编语言知识大全
第一章基础知识: 一.机器码:1.计算机只认识0,1两种状态。而机器码只能由0,1组成。故机器码相当难认,故产生了汇编语言。 2.其中汇编由三类指令形成:汇编指令(有机器码对应),伪指令,其他符号(编译的时候有用)。 每一总CPU都有自己的指令集;注意学习的侧重点。 二.存储器:1.存储单元中数据和指令没任何差别。 2.存储单元:Eg:128个储存单元(0~127)128byte。 线: 1.地址总线:寻址用,参数(宽度)为N根,则可以寻到2^N个内存单元。 据总线:传送数据用,参数为N根,一次可以传送N/8个存储单元。 3.控制总线:cpu对元器件的控制能力。越多控制力越强。 四.内存地址空间:1.由地址总线决定大小。 2.主板:cpu和核心器件(或接口卡)用地址总线,数据总线,控制总 线连接起来。 3.接口卡:由于cpu不能直接控制外设,需通过接口卡间接控制。
4.各类存储器芯片:RAM,BIOS(主板,各芯片)的ROM,接卡槽的 RAM CPU在操控他们的时候,把他们都当作内存来对待,把他们总的看作一个由 若干个存储单元组成的逻辑存储器,即我们所说的内存地址空间。 自己的一点理解:CPU对内存的操作是一样的,但是在cpu,内存,芯片之间的硬件本身所牵扯的线是不同的。所以一些地址的功能是对应一些芯片的。 第二章寄存器 引入:CPU中含有运算器,寄存器,控制器(由内部总线连接)。而寄存器是可以用来指令读写的部件。8086有14个寄存器(都是16位,2个存储空间)。 一.通用寄存器(ax,bx,cx,dx),16位,可以分为高低位 注意1.范围:16位的2^16-1,8位的2^8-1 2.进行数据传送或运算时要注意位数对应,否则会报错 二.字:1. 1个字==2个字节。 2. 在寄存器中的存储:0x高位字节低位字节;单元认定的是低单元 数制,16进制h,2进制b
汇编语言程序设计答案+廖建明-chap6
第六章习题答案 6.1 C 6.2 D 6.3 D 6.4 C 6.5 B 6.6 错。在L0: MOV AL,0语句后面加上RET语句 6.7 段内调用:保存IP内容入栈;更新IP内容 段间调用:保存CS,IP内容入栈;更新CS,IP内容 6.8 段内返回:从栈中弹出一个字的内容送入IP寄存器;SP=(SP)+n(如果带有操作数n) 段间返回:从栈中弹出两个字的内容分别送入IP,CS;SP=(SP)+n(如果带有操作数n) 6.9 从栈中弹出两个字的内容分别送入IP,CS;SP=(SP)+4 6.10 在需要和主程序共享寄存器的时候需要保护寄存器 6.11 寄存器传递参数;堆栈传递参数;地址表传递参数 6.12 相同点:都进行一次程序跳转 不同点:CALL会保存原地址IP入栈,而JMP不会 6.13 错误:子程序是FAR类型的,CALL时用的是NEAR 6.14 BX;(BX);SHIFT 6.15 图略 6.16 DATA SEGMENT N DB 5 DATA ENDS STACK SEGMENT DW 20H DUP(0) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK BEGIN: MOV AX,DATA MOV DS,AX MOV AL,N CALL FACT;调用阶乘子程序计算5! MOV RESULT,DX DEC N MOV AL,N CALL FACT;调用阶乘子程序计算4! ADD RESULT,DX DEC N MOV AL,N CALL FACT;调用阶乘子程序计算3! ADD RESULT,DX MOV AH,4CH
汇编语言王爽第二版课后答案
第一章基础知识 检测点(第8页) ---------------------- (1) 13 (2) 1024,0,1023 (3) 8192,1024 (4) 2^30,2^20,2^10 (5) 64,1,16,4 (6) 1,1,2,2,4 (7) 512,256 (8) 二进制 注意: 1.第4题中的符号'^'指求幂运算(如: 2^30指2的30次方) 第二章寄存器(CPU工作原理) 检测点(第18页) ---------------------- (1)写出每条汇编指令执行后相关寄存器中的值。第一空:F4A3H 第二空:31A3H 第三空:3123H 第四空:6246H 第五空:826CH 第六空:6246H 第七空:826CH 第八空:04D8H 第九空:0482H 第十空:6C82H 第十一空:D882H 第十二空:D888H 第十三空:D810H 第十四空:6246H (2)只能使用目前学过的汇编指令,最多使用4条指令,编程计算2的4次方。 解答如下: mov ax,2 add ax,ax add ax,ax add ax,ax 检测点(第23页) ---------------------- (1)00010H,1000FH (2)1001H,2000H 第2题说明: 因为段的起始地址要为16的倍数。所以当段地址小于1001H或大于2000H时CPU都无法寻到。 检测点(第33页) ----------------------答:CPU修改了4次IP的值。 情况如下: 第1次:执行完mov ax,bx后 第2次:执行完sub ax,ax后 第3次:读入jmp ax后 第4次:执行完jmp ax后 最后IP的值为0 实验1 查看CPU和内存,用机器指令和汇编指令编程(第33页) ----------------------------------------------------- 1.预备知识:Debug的使用 <此部分略> 2.实验任务(第43页) (1) <此部分略> (2) <此部分略> (3) 通过DEBUG中的D命令查看到主板的生产日期[以月、日、年,分隔符为'/'的格式]存储在内存ffff:0005~ffff:000C(共8个字节单元中)处。此生产日期不能被改变,因为其具有‘只读’属性。 (4) 通过向内存中的显存写入数据,使计算机根据写入的数据进行ASCII转换,并将转换后且可打印的字符输出到屏幕上。<注:关于显存的详细讨论不在此题范围> 第三章寄存器(内存访问) 检测点(第52页) ---------------------- (1)(题目:略) 第一空:2662H 第二空:E626H 第三空:E626H 第四空:2662H 第五空:D6E6H 第六空:FD48H 第七空:2C14H 第八空:0000H 第九空:00E6H 第十空:0000H 第十一空:0026H 第十二空:000CH 提示:此题可在DEBUG中利用E命令在本机上按照题目中所给出的内存单元及其数据进行相应地修改,然后再用A命令进行写入(题目中所给出的)相应的汇编指令,最后再进行T命令进行逐步执行,以查看相应结果。
汇编语言第6章答案
第6章流程控制 习题1. 指令指针EIP是通用寄存器还是专用寄存器?有指令能够直接给它赋值吗?哪些指令的执行会改变它的值? 解答:EIP是专用寄存器,不能通过指令直接给它赋值。可以改变其值的指令有:(1)无条件分支,包括:跳转(jmp)、调用(call)、中断(int)。 (2)条件分支,与标志位CF、OF、PF、SF、ZF相关的条件跳转指令。 (3)循环指令,LOOP、LOOPE等。 3. 相对于BASIC语言中GOTO语句作用的IA-32处理器指令是哪条? 跳转指令jmp 习题4. IA-32处理器通过改变EIP寄存器的数值就可以改变程序,如果程序需要无条件跳转到标号done位置执行,使用“MOVL done, %EIP”语句是否可以达到,为什么?如果不能实现该功能,应该使用哪条指令? 解答:不能。不能对EIP寄存器直接赋值。使用指令jmp done可以实现。 习题6 条件转移指令Jxx所利用的条件保存在何处?有多少个不同条件的转移指令? 保存在EFLAGES寄存器中 共16个(P107) 习题7 JA和JG指令发生跳转的条件都是“大于”,它们有什么区别? 在处理带符号值和无符号值时有所区别。计算无符号值时,使用JA,对于带符号值,使用JG。 习题8. 执行如下程序片断后,CMP指令分别使得5个状态标志CF、ZF、SF、OF和PF为0还是为1?它会使得哪些条件转移指令条件成立、发生转移? movl $0x20, %eax movl $0x80, %ebx cmpl %ebx,%eax 解答:CF=1 ZF=0 SF=1 OF=0 PF=1 可以使得发生转移的指令有:JC JS JP JNZ JNO 习题9. 有如下程序片断,请使用一条指令代替其中的两条指令: (1) again: ... jz next jmp again next: (2) again: ... jle next
汇编语言王爽第二版课后答案
第一章基础知识 检测点1.1(第8页) ---------------------- (1) 13 (2) 1024,0,1023 (3) 8192,1024 (4) 2^30,2^20,2^10 (5) 64,1,16,4 (6) 1,1,2,2,4 (7) 512,256 (8) 二进制 注意: 1.第4题中的符号'^'指求幂运算(如: 2^30指2的30次方) 第二章寄存器(CPU工作原理) 检测点2.1(第18页) ---------------------- (1)写出每条汇编指令执行后相关寄存器中的值。第一空:F4A3H 第二空:31A3H 第三空:3123H 第四空:6246H 第五空:826CH 第六空:6246H 第七空:826CH 第八空:04D8H 第九空:0482H 第十空:6C82H 第十一空:D882H 第十二空:D888H 第十三空:D810H 第十四空:6246H (2)只能使用目前学过的汇编指令,最多使用4条指令,编程计算2的4次方。 解答如下: mov ax,2 add ax,ax add ax,ax add ax,ax 检测点2.2(第23页) ---------------------- (1)00010H,1000FH (2)1001H,2000H 第2题说明: 因为段的起始地址要为16的倍数。所以当段地址小于1001H或大于2000H时CPU都无法寻到。 检测点2.3(第33页) ----------------------答:CPU修改了4次IP的值。 情况如下: 第1次:执行完mov ax,bx后 第2次:执行完sub ax,ax后 第3次:读入jmp ax后 第4次:执行完jmp ax后 最后IP的值为0 实验1 查看CPU和内存,用机器指令和汇编指令编程(第33页) ----------------------------------------------------- 1.预备知识:Debug的使用 <此部分略> 2.实验任务(第43页) (1) <此部分略> (2) <此部分略> (3) 通过DEBUG中的D命令查看到主板的生产日期[以月、日、年,分隔符为'/'的格式]存储在内存ffff:0005~ffff:000C(共8个字节单元中)处。此生产日期不能被改变,因为其具有‘只读’属性。 (4) 通过向内存中的显存写入数据,使计算机根据写入的数据进行ASCII转换,并将转换后且可打印的字符输出到屏幕上。<注:关于显存的详细讨论不在此题范围> 第三章寄存器(内存访问) 检测点3.1(第52页) ---------------------- (1)(题目:略) 第一空:2662H 第二空:E626H 第三空:E626H 第四空:2662H 第五空:D6E6H 第六空:FD48H 第七空:2C14H 第八空:0000H 第九空:00E6H 第十空:0000H 第十一空:0026H 第十二空:000CH 提示:此题可在DEBUG中利用E命令在本机上按照题目中所给出的内存单元及其数据进行相应地修改,然后再用A命令进行写入(题目中所给出的)相应的汇编指令,最后再进行T命令进行逐步执行,以查看相应结果。
汇编语言(沈美明,温冬婵)课后答案
汇编语言程序设计(第二版) (清华大学IBM-PC 汇编语言程序设计(第二版)沈美明温冬婵编著) 第二章 1、答:直接由指令指定的I/O端口数为256个。 2、答: 3、答:字节单元:(30022H)= AB H,(30024H)= EF H 字单元:(30021H)= AB34 H,(30022H)= CDAB H。 4、答:3017:000A的存储单元的物理地址是3017AH, 3015:002A的存储单元的物理地址是3017AH, 3010:007A的存储单元的物理地址是3017AH。 5、答:该程序的第一个字的物理地址是0AAA40H。 6、答:条件标志OF、SF、ZF、CF的值依次分别为0、0、0、0。 7、答:(1)AX、BX、CX、DX、AH、AL、BH、BL、CH、CL、DH、DL、 SP、BP、DI、SI(注意:学生尽量不要用SP参与加减运算) (2)CX (3)DX、AX、AH、AL (4)CS、DS、ES、SS (5)FLAGS (6)IP (7)SS、SP、BP 8、答:可以用来指示存储器地址的寄存器有BX、SP、BP、DI、SI、IP、CS、DS、 ES、SS。 9、答:唯一正确的是D。 第三章 2、答: (1)ADD DX, BX (2)ADD AL, [BX][SI] (3)ADD [BX+0B2H], CX (4)ADD [0524H], 2A59H (5)ADD AL, 0B5H 3、答: (1)MOV BX, OFFSET BLOCK + 0AH MOV DX, [BX] (2)MOV BX, 0AH MOV DX, BLOCK[BX] (3)MOV BX, OFFSET BLOCK MOV SI, 0AH MOV DX, [BX][SI]
汇编语言与微机接口技术作业6章(含答案)
作业: 课本6.5 6.7 第6章补充题参考答案 补充题1:初始化8259A控制器,系统中有一片8259A,中断请求用电平触发,中断类型号为60H~67H,特殊全嵌套方式,不用缓冲方式,采用中断自动结束方式。8259A端口地址为93H/94H。编写其初始化程序。 答: MOV AL, 1BH ;设置ICW1(中断请求信号采用电平触发方式,单片,
OUT 94H, AL MOV AL, 60H ;设置ICW2(将中断类型码高5位指定为01100) OUT 93H, AL MOV AL, 13H ;设置ICW4(用特殊全嵌套方式;用中断自动结束方式;采用非缓冲方式,工作于8088/8086系统) OUT 93H, AL 补充题2:开关K4的信号输入到中断控制器8259A的IR2,当K4开关合上瞬间,产生中断,在中断服务程序中完成读取开关K0~K3的状态,并在7段数码管上显示数字或符号。设输出接口的地址为3F2H,输入接口地址为3F3H。当开关K0~K3的状态分别为0000~1111时,在7段数码管上对应显示’0’~’F’,8259A的端口为3F0H和3F1H.设其中断号为08H~0FH。1. 设计相关的接口电路,包括8259A的连接。 2. 编写主程序完成初始化8259A和相关中断向量的设置。 3. 编写中断服务程序。 答: 1. 接口电路图 2. 初始化程序: INPORT EQU 03F3H OUTPORT EQU 03F2H PORT8259 EQU 03F0H …… ;设置数码管显示数据 Seg7 DB 3FH,06H, 5BH,4FH,66H,6DH, 7DH,07H,7FH,67H,77H, 7CH,39H,5EH,79H,71H …… MOV AL, 13H ;设置ICW1(中断请求信号采用边沿触发方式,单片,
汇编语言基础练习题目
一、填空 1.在8086/8088的计算机中,存储单元的20位物理地址由两部分组成,即16 位的段地址和16位的偏移地址,物理地址= 段地址×10H+偏移量。 2.段的起始地址必须是某小段的首地址,它能被 10H 整除。 3.已知01020H字单元的内容为6A58H,请分别写出它的两个字节单元的地址和内容:(01020H)=58H,(01021H)=6AH。 4.指令执行后,若标志寄存器的ZF=0,则表示结果不为0;若SF=0,则表示结果的符号是正号,即结果为正数。 5.控制器从存储器取出一条指令后,指令指针寄存器IP的内容是将要执行的下一条指令开始的偏移地址。 6.段地址和偏移地址为1000:127B的存储单元的物理地址是 1127BH。 解:由物理地址= 段地址×10H+偏移量的公式可得 物理地址=1000H×10H+127BH=10000H+127BH=1127BH。 二、选择 1.与CS寄存器组合才能形成代码段的物理地址的寄存器是( C )。 A.SP寄存器 B.BP寄存器 C.IP寄存器 D.BX寄存器 2.如果存储器分段时,一个段最多允许16K个字单元,那么表示该段内偏移地址的二进制数至少是( A )。 A.15位 B.16位 C.17位 D.18位 解:16K个字单元,即为32K个字节单元。由于2的15次方为32K,因此至少需要15位二进制数才能表示16K个字单元。 3.已知一数据段的段地址是0100H,这个段的第6个字单元的物理地址是( B )。 A.01010H B.0100AH C.01012H D.01006H 解:由于一个字单元占用两个字节,第一个字单元的偏移地址为0000H,因此第一个字单元的物理地址为01000H。以后每一个字单元的地址在前一个的基
第6章-程序设计语言-习题与答案
第六章习题 (1)复习题 1、简述自然语言与形式语言的概念以及区别、汇编语言与机器语言的概念及区别。 自然语言是某一社会发展中形成的一种民族语言,而形式语言是进行形式化工作的元语言,它是以数学和数理逻辑为基础的科学语言。用机器指令形式编写的程序称为机器语言,用带符号或助记符的指令和地址代替二进制代码成为语言进化的目标。这些使用助记符语言的语言后来就被称之为汇编语言。 (P135 P136) 2、什么是高级程序设计语言?它有什么特点? 高级语言是汇编语言的一种抽象。高级语言的设计目标就是使程序员摆脱汇编语言细节的繁琐。高级语言同汇编语言都有一个共性,那就是:它们必须被转化为机器语言,这个转化的过程称为解释或编译。 (1)高级语言接近算法语言,易学、易掌握; (2)高级语言设计出来的程序可读性好,可维护性强,可靠性高; (3)高级语言与具体的计算机硬件关系不大,其程序可移植性好,重用率高; (4)高级语言自动化程度高,开发周期短,利于提高程序的质量。 (P138) 3、列举程序设计语言的几种范型。 程序语言大致分为命令式程序设计语言、面向对象的程序设计语言、函数式程序设计语言和逻辑型程序设计语言等范型。
(P138-140) 4、简述语言虚拟机。 提示:语言虚拟机是某种语言的解释器。语言虚拟机是建立在硬件和操作系统之上,针对不同的硬件和操作系统有不同的虚拟机,通过语言虚拟机屏蔽掉硬件的差异。这样使得硬件系统能够支持这种语言编写的程序的有效执行。目前最流行的语言虚拟机是Java虚拟机。(P147) 5、计算机执行用高级语言编写的程序有哪些途径?它们之间的主要区别是什么? 提示:主要有编译、解释等方式,也有两种方式的混合使用的形式。 编译是使用编译器将高级语言编写的源程序转换成计算机可以执行的机器语言可执行程序,也可以理解为用编译器产生可执行程序的动作。编译方式是一次编译,然后执行程序可以反复多次执行。 解释是另一种将高级语言转换为可执行程序的方式。与编译不同,解释性语言的程序不需要编译,省了道工序,解释性语言在运行程序的时候才翻译,每个语句都是执行的时候才翻译。这样解释性语言每执行一次就要翻译一次,效率比较低。 近来随着网络的发展,为了实现跨平台但同时又保证一定的效率,出现了编译、解释混合的方式,先用伪编译形成效率较高中间代码,再用语言虚拟机进行解释执行,以屏蔽掉硬件的差异。 (P144-147) 6、试分析对象和类的关系。 对象:对象是人们要进行研究的任何事物,它具有状态和操作。面向对象语言把状态和操作封装于对象实体之中,并提供一种访问机制,使对象的“私有数据”仅能由这个对象的操作
汇编语言第六章答案
6.1 下面的程序段有错吗?若有,请指出错误。 CRAY PROC PUSH AX ADD AX, BX RET ENDP CRAY 答:程序有错。改正如下: CRAY PROC ADD AX, BX RET CRAY ENDP ;CRAY是过程名,应放在ENDP的前面 6.2 9BH F7H 57H 80H F0A0:00B0H 先PUSH,SP-2 再PUSH,SP-2 POP, SP+2 6.2 题堆栈及SP内容的变化过程 已知堆栈寄存器SS的内容是0F0A0H,堆栈指示器SP的内容是00B0H,先执行两条把8057H 和0F79BH分别入栈的PUSH指令,然后执行一条POP指令。试画出示意图说明堆栈及SP 内容的变化过程。 答:变化过程如右图所示: 6.3 分析下面的程序,画出堆栈最满时各单元的地址及内容。 ;******************************************** S_SEG SEGMENT A T 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 (FLAGS) (AX) T_ADDR 0000
(DS) 1000:0184 :0186 :0188 :018A :018C :018E SP: 0186 6.3 题堆栈最满时各单元的地址及内容 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 A T 500H ;定义堆栈段 DW 128 DUP (?) TOS LABEL WORD STACK ENDS ;******************************************** CODE SEGMENT ;定义代码段 MAIN PROC FAR ;主程序部分 ASSUME CS: CODE, SS: STACK START: MOV AX, STACK
第6章 程序设计语言 习题与答案教程文件
第6章程序设计语言习题与答案
第六章习题 (1)复习题 1、简述自然语言与形式语言的概念以及区别、汇编语言与机器语言的概念及区别。 自然语言是某一社会发展中形成的一种民族语言,而形式语言是进行形式化工作的元语言,它是以数学和数理逻辑为基础的科学语言。用机器指令形式编写的程序称为机器语言, 用带符号或助记符的指令和地址代替二进制代码成为语言进化的目标。这些使用助记符语言的语言后来就被称之为汇编语言。 (P135 P136) 2、什么是高级程序设计语言?它有什么特点? 高级语言是汇编语言的一种抽象。高级语言的设计目标就是使程序员摆脱汇编语言细节的繁琐。高级语言同汇编语言都有一个共性,那就是:它们必须被转化为机器语言,这个转化的过程称为解释或编译。 (1)高级语言接近算法语言,易学、易掌握; (2)高级语言设计出来的程序可读性好,可维护性强,可靠性高; (3)高级语言与具体的计算机硬件关系不大,其程序可移植性好,重用率高;(4)高级语言自动化程度高,开发周期短,利于提高程序的质量。 (P138) 3、列举程序设计语言的几种范型。 程序语言大致分为命令式程序设计语言、面向对象的程序设计语言、函数式程序设计语言和逻辑型程序设计语言等范型。
(P138-140) 4、简述语言虚拟机。 提示:语言虚拟机是某种语言的解释器。语言虚拟机是建立在硬件和操作系统之上,针对不同的硬件和操作系统有不同的虚拟机,通过语言虚拟机屏蔽掉硬件的差异。这样使得硬件系统能够支持这种语言编写的程序的有效执行。目前最流行的语言虚拟机是Java虚拟机。 (P147) 5、计算机执行用高级语言编写的程序有哪些途径?它们之间的主要区别是什么? 提示:主要有编译、解释等方式,也有两种方式的混合使用的形式。 编译是使用编译器将高级语言编写的源程序转换成计算机可以执行的机器语言可执行程序,也可以理解为用编译器产生可执行程序的动作。编译方式是一次编译,然后执行程序可以反复多次执行。 解释是另一种将高级语言转换为可执行程序的方式。与编译不同,解释性语言的程序不需要编译,省了道工序,解释性语言在运行程序的时候才翻译,每个语句都是执行的时候才翻译。这样解释性语言每执行一次就要翻译一次,效率比较低。 近来随着网络的发展,为了实现跨平台但同时又保证一定的效率,出现了编译、解释混合的方式,先用伪编译形成效率较高中间代码,再用语言虚拟机进行解释执行,以屏蔽掉硬件的差异。 (P144-147)
第6章 程序设计语言 习题与答案
第六章习题P159-161 一、复习题 1、简述自然语言与形式语言的概念以及区别、汇编语言与机器语言的概念及区别。 自然语言是某一社会发展中形成的一种民族语言,而形式语言是进行形式化工作的元语言,它是以数学和数理逻辑为基础的科学语言。用机器指令形式编写的程序称为机器语言,用带符号或助记符的指令和地址代替二进制代码成为语言进化的目标。这些使用助记符语言的语言后来就被称之为汇编语言。(P144- P146) 2、试述计算机语言的类型,它们各有什么特点? 1.机器语言,是最低级的语言,由二进制码组成,最早期的程序员通过在纸带上打点来写程序 2.汇编语言,用助记符和地址符代替了二进制码,更易于编写。 3.高级语言,相对于汇编语言又上升了一步,更接近于自然语言,如C语言、Pascal、Java、C#等都是高级语言。(P145-147) 3、列举程序设计语言的几种范型。 程序语言大致分为命令式程序设计语言、面向对象的程序设计语言、函数式程序设计语言和逻辑型程序设计语言等范型。(P147-149) 4、简述语言虚拟机。 提示:语言虚拟机是某种语言的解释器。语言虚拟机是建立在硬件和操作系统之上,针对不同的硬件和操作系统有不同的虚拟机,通过语言虚拟机屏蔽掉硬件的差异。这样使得硬件系统能够支持这种语言编写的程序的有效执行。目前最流行的语言虚拟机是Java虚拟机。(P156) 5、计算机执行用高级语言编写的程序有哪些途径?它们之间的主要区别是什么? 提示:主要有编译、解释等方式,也有两种方式的混合使用的形式。 编译是使用编译器将高级语言编写的源程序转换成计算机可以执行的机器语言可执行程序,也可以理解为用编译器产生可执行程序的动作。编译方式是一次编译,然后执行程序可以反复多次执行。 解释是另一种将高级语言转换为可执行程序的方式。与编译不同,解释性语言的程序不需要编译,省了道工序,解释性语言在运行程序的时候才翻译,每个语句都是执行的时候才翻译。这样解释性语言每执行一次就要翻译一次,效率比较低。 近来随着网络的发展,为了实现跨平台但同时又保证一定的效率,出现了编译、解释混合的方式,先用伪编译形成效率较高中间代码,再用语言虚拟机进行解释执行,以屏蔽掉硬件的差异。(P154-157) 6、请画出编译程序的总框图。如果你是一个编译程序的总设计师,设计编译程序时应当考虑哪些问题? 作为一个编译程序的总设计师,首先要深刻理解被编译的源语言其语法及语义;其次,
汇编语言第六章答案
下面的程序段有错吗若有,请指出错误。 CRAY PROC PUSH AX ADD AX, BX RET ENDP CRAY 答:程序有错。改正如下: CRAY PROC ADD AX, BX RET CRAY ENDP ;CRAY是过程名,应放在ENDP的前面 9BH F7H 57H 80H F0A0:00B0H 先PUSH,SP-2 再PUSH,SP-2 POP, SP+2 题堆栈及SP内容的变化过程 已知堆栈寄存器SS的内容是0F0A0H,堆栈指示器SP的内容是00B0H,先执行两条把8057H 和0F79BH分别入栈的PUSH指令,然后执行一条POP指令。试画出示意图说明堆栈及SP内容的变化过程。 答:变化过程如右图所示: 分析下面的程序,画出堆栈最满时各单元的地址及内容。 ;******************************************** 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 (FLAGS) (AX) T_ADDR 0000
(DS) 1000:0184 :0186 :0188 :018A :018C :018E SP: 0186 题堆栈最满时各单元的地址及内容 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 ;程序结束 答:堆栈最满时各单元的地址及内容如右图所示: 分析下面的程序,写出堆栈最满时各单元的地址及内容。;******************************************** 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
汇编语言第六章 输入输出和WIN32编程
第六章输入/输出和中断 和WIN32编程 前面已经讲过有关输入/输出的问题,主要是用DOS中断调用INT21H来完成键盘输入以及屏幕显示。对于计算机来说,仅有这种输入/输出还不够,因为DOS的中断调用无法实现对其它外设的控制。关于如何用汇编程序实现主机与外设之间的信息交换,将是本章的主要内容。包括: 输入输出指令的使用格式及功能; 主机与外部设备之间传送数据的方式; 中断的概念及中断处理程序设计; WIN32程序设计基本方法与技术。 6.1I/O设备与数据传送方式 一.主机与外设之间数据的传送方式 计算机与外设之间传送数据有如下4中方式: 1.无条件传送方式:适合于CPU与外设同步的情况。直接传送,高速外设与主机之间数据传送。
2.查询传送方式:适合于低速外设与主机之间数据传送。 3.中断传送方式:适合于低速外设与主机之间数据传送。 4.直接存贮器(又称DMA)传送方式:适合于高速外存与主机的数据传送。 其中:无条件传送和查询传送,直接在端口上利用IN和OUT 指令传送数据。 中断传送:在DOS及BIOS层上通过系统功能调用的中断指令实现。 直接存贮方式:在端口上,采用通道技术实现。在计算机准备好接收,外设准备好传送数据时,外设向CPU发一个请求DMA 传送信号,此时CPU让出总线控制权,使外设与主存在短时间内成批传送数据。 二.外设与主机传送的接口与信息 1.端口与接口 计算机的外设都是通过接口连接到系统上,每个接口由一组寄存器组成,寄存器都有一个称为I/O端口的地址编码。 也就是,每一台外设都通过硬件接口与主机端口相连,并交换信息。
主机外设 CPU 内存 I/O 存贮空间(端口) 接口 I/O 操作 接口的组成:设备状态寄存器、设备控制寄存器、数据寄存器。上述寄存器在I/O 空间中都有固定编码。 I/O 端口的地址空间:允许设置64K 个8位端口或32K 个16位端口。对I/O 空间的访问用IN 或OUT 两个指令。 I/O 端口地址分配,可以查手册。 如:40H ~43H 时钟/定时器,60H ~63H 为8255通讯芯片的接口。 2.外设与主机的信息交换传送的信息分为三类: 1 控制信息:CPU 把控制信息从端口输出到对应外设接口的 控制寄存器中,告诉外设应做什么。 2 状态信息:把外设的状态寄存器中的内容送到对应的端 口中,以便CPU 了解外设状态。 3 数据信息:需要交换的数据(8位、16位)。
汇编语言(王爽)第三版检测点答案(带目录).pdf
汇编语言答案(王爽) 第一章 检测点1.1 (1)1个CPU的寻址能力为8KB,那么它的地址总线的宽度为13位。 (2)1KB的存储器有1024个存储单元,存储单元的编号从0到1023。(3)1KB的存储器可以存储8192(2^13)个bit,1024个Byte。 (4)1GB是1073741824(2^30)个Byte、1MB是1048576(2^20)个Byte、1KB是1024(2^10)个Byte。 (5)8080、8088、80296、80386的地址总线宽度分别为16根、20根、24根、32根,则它们的寻址能力分别为:64(KB)、1(MB)、16(MB)、4(GB)。(6)8080、8088、8086、80286、80386的数据总线宽度分别为8根、8根、16根、16根、32根。则它们一次可以传送的数据为:1(B)、1(B)、2(B)、2(B)、4(B)。 (7)从内存中读取1024字节的数据,8086至少要读512次,80386至少要读256次。 (8)在存储器中,数据和程序以二进制形式存放。 解题过程: (1)1KB=1024B,8KB=1024B*8=2^N,N=13。 (2)存储器的容量是以字节为最小单位来计算的,1KB=1024B。 (3)8Bit=1Byte,1024Byte=1KB(1KB=1024B=1024B*8Bit)。 (4)1GB=1073741824B(即2^30)1MB=1048576B(即2^20)1KB=1024B(即2^10)。(5)一个CPU有N根地址线,则可以说这个CPU的地址总线的宽度为N。这样的CPU最多可以寻找2的N次方个内存单元。(一个内存单元=1Byte)。 (6)8根数据总线一次可以传送8位二进制数据(即一个字节)。 (7)8086的数据总线宽度为16根(即一次传送的数据为2B)1024B/2B=512,同理1024B/4B=256。 (8)在存储器中指令和数据没有任何区别,都是二进制信息。 第二章 检测点 2.1 (1)写出每条汇编指令执行后相关寄存器中的值。 mov ax,62627AX=F4A3H mov ah,31H AX=31A3H mov al,23H AX=3123H
微型计算机技术课后答案第六章-第八章
6.1分类说明8086CPU有哪几种中断? 答:8086CPU中断源可分为内部中断和外部中断,内部中 断有溢出中断、除法出错中断、INTn指令中断、断点中断、单步(陷阱)中断;外部中断有可屏蔽中断INTR\不可屏蔽中断NMI。 6.2 简述8086可屏蔽中断的响应过程。 可屏蔽中断INTR接受来自普通外设的中断请求信号(一般使用可编程中断控制器8059A来管理此类外设的中断请求),当该信号线有效时,CPU将根据中断允许标志IF的 状态来决定是否响应。如果IF=0,则表示INTR线上中断 被屏蔽或禁止,CPU将不理会该中断请求而处理下一条指令。由于CPU并不锁存INTR信号,INTR信号必须保持有 效状态,直到接受到响应信号或撤销请求为止。如果IF=1,则表示INTR线上的中断开放,CPU在完成现在正在执行的指令后,识别该中断请求,并进行中断处理。 6.5 中断应答时序如图6.2所示,说明前后两个INTA周期 的任务。 第一个INTA表示对中断请求的响应,用于通知中断请求设备,第二个INTA用于将中断类型号送数据总线的低8位上。期间LOCK信号用于保证在中断响应过程中不会被其他CPU 占用总线而导致中断响应失败。
6.9 某外设中断类型号为10H,它的中断服务程序的入口地址为1020H:3FC9H,求其向量地址并具体描述中断向量的各字节在存储器中的存储情况。 解:向量地址:10H*4=40H [0040H]、[0041H]、[0042H]、[0043H]依次存放C9H、3FH、20H、10H 6.10 某外设的中断服务子程序名称为INT_PROC,其中断类型号为18H,试编写一程序段将该外设的中断向量装入到中断向量表中。 解:向量地址:18H*4=60H PUSH DS MOV AX,0 MOV DS,AX MOV WORD PTR [0060H],OFFSET INT_PROC MOV WORD PTR [0062H],SEG INT_PROC POP DS HLT 7.2 简述CPU与外围设备交换信息的过程。 解:(1)CPU向设备所在地接口地址发送读写控制; (2)接口向设备发送数据或状态信息;
汇编语言课后答案第6章
第6章习题 6.1 主程序与子程序之间进行参数传递有哪几种方法?简单说明并比较。 6.2 编写一个子程序,把16位二进制数转换为5位十进制数ASCII码。 6.3 编写一个把16位二进制数转换为4位十六进制数ASCII码的子程序 6.4 编写一个计算字符串长度的子程序,字符串以0为结尾标志。入口参数:字符串的首 地址指针为DS:SI;出口参数:在AX中返回字符串的长度。 6.5 编写程序,将字符串STING1的内容复制到字符串STRING2中。要求由子程序来实现字 符串的复制,并采用寄存器来传递参数。 6.6 用通过存储单元传递参数的方法完成上题。 6.7 用通过堆栈传递参数的方法完成上题。 6.8 设计程序,从键盘接收一个字符串,显示字符串的长度,要求计算长度的工作由子程 序来实现。 6.9 编程计算三个变量的绝对值之和,求绝对值采用子程序结构以简化程序。 6.10 编写程序完成运算X=A*B+C(设各数及结果都不超过65536),A、B、C为从键盘输入 的十进制数,要求从键盘接收十进制数并转换为二进制的工作由子程序来完成。 6.11 编写程序,将内存缓冲区BUFFER1中的10个压缩型BCD码数转换成非压缩的BCD码, 保存到缓冲区BUFFER2中。要求转换工作由子程序来完成。 6.12 从键盘输入一组字符,直到按ESC键为止,存储在内存缓冲区BUFFER中。要求用子程 序来实现当输入字符为a~z时,则修改为A~Z。 6.13 阅读下面子程序,说明它完成的功能是什么?子程序的入口参数和出口参数各是什 么? SUM16 PROC NEAR MOV AX,0 MOV DX,0 LOP:ADD AX,[BX] ADC DX,0 ADD BX,2 LOOP LOP RET SUM16 ENDP 完成N个数(字)的累加。入口参数:CX=N,BX=N个数的首地址。出口参数:累加和,DX:AX。 6.14 编写子程序,把用ASCII码表示的两位十进制数转换为对应的二进制数。 入口参数:DH=十位数的ASCII码,DL=个位数的ASCII码; 出口参数:AL=对应的二进制数。