本章主要介绍了宏汇编语言的格式、表达式,常规运算,并简要介绍了BIOS和DOS功能调用,常用的DOS系统功能调用。
1.填空题
(1)假设DST DW 1234H,5678H,执行LES DI,DWORD PTR DST 指令后,(DI)= 。
(2)阅读下面的源程序:
DSEG SEGMENT
DB -1
ARRAY DB 4,6,13,18,0
X EQU 2
LEN EQU $-ARRAY
DSEG ENDS
SSEG SEGMENT STACK
DB 256 DUP(0)
SSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG,SS:SSEG
START PROC FAR
PUSH DS
XOR AX,AX
PUSH AX
MOV AX,DSEG
MOV DS,AX
MOV AL,X
MOV BX,OFFSET ARRAY
MOV SI,LEN-2 ;设置指向ARRAY+3字节单元的指针
ADD BX,SI ;形成基地址
MOV SI,0
LP: CMP AL,[BX+SI]
JGE INS
MOV DI,[BX+SI]
MOV [BX+SI+1],DI ;移动数据
DEC SI
JMP LP
INS: MOV [BX+SI+1],AL
RET
START ENDP
CSEG ENDS
END START
上面的程序执行结束后,ARRAY字节单元中的数据是 。
(3)根据下列指令序列,CX寄存器中的值是 。
SHR1 DW 'AB'
SHR2 DB 16 DUP(?)
CNT EQU $-STR1
MOV CX,CNT
(4)某程序的数据段定义如下,请填写完整。
DATA SEGMENT
TAB DB 'MICROSOFT'
DB 'MS-DOS 6.22'
DW 1234
DB 'IBMPS/2'
TABLEN EQU ;数据长度
DATA ENDS
(5)执行下面的程序段后,AL中的内容是 。
BUF DW 2152H,3416H,5731H,4684H
MOV BX,OFFSET BUF
MOV AL,3
XLAT
2.选择题
(1) 是一种将指令及其处理的对象以便于记忆的助记符表示的计算机语言。
A.机器语言 B.汇编语言 C.高级语言 D.人工智能语言
(2)若定义DAT DB '1234',执行指令MOV AX,WORD PTR DAT后,AX寄存器中的内容是 。
A.1234H B.3412H C.3132H D.3231H
(3)若汇编语言程序的宏定义中使用了标号,则该标号必须使用下列 伪指令予以说明。
A.LOCAL B.PUBLIC C.EXTRN D.LABEL
(4)下面的程序段
DAT DB 1,2,3,4
MOV AL,0
MOV CX,4
MOV SI,3
LP: ADD AL,DAT[SI]
DEC SI
LOOP LP
HLT
执行结束后,AL和CX寄存器中的内容分别是 。
A.4和3 B.7和2 C.9和1 D.10和0
(5)执行下面的程序段后,102H单元中的数据是 。
ORG 100H
DAT DB 12H,13H,14H
MOV BX, OFFSET DAT
INC BYTE PTR [BX]
INC BX
DEC BYTE PTR [BX]
HLT
A.15H B.12H C.13H D.14H
3.上机操作题
部分程序已给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中。运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。
填空BEGIN和END之间已给出的一段源程序使其完整(空白已用横线标出,每行空白一般只需一条指令,但采用功能相当的多条指令亦可),或删除BEGIN和END之间原有的代码并自行编程来完成要求的功能。
对程序必须进行汇编,并与IO.OBJ链接产生PROG1.EXE执行文件,最终运行程序产生结果(无结果或结果不正确者均不得分)。调试中若发现整个程序中存在错误之处,请加以修改。
(1)试编制程序,其功能是:在递增的有序字节数组中插入一个正整数,并按指定的数组个数存入内存区中。假设数组元素均为正数。
例如:将02H插入数组01H,03H,04H,05H…,结果为01H,02H,03H,04H,05H…。
EXTRN LOAD:FAR,SAVE:FAR
N EQU 10
DSEG SEGMENT
MIN DB -1
SOURCE DB N DUP(?)
X EQU 2 ;插入的个数
RESULT DB N DUP(0)
NAME0 DB 'INPUT1.DAT',0
NAME1 DB 'OUTPUT1.DAT',0
DSEG ENDS
SSEG SEGMENT STACK
DB 256 DUP(?)
SSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,SS:SSEG,DS:DSEG
START PROC FAR
PUSH DS
XOR AX,AX
PUSH AX
MOV AX,DSEG
MOV DS,AX
MOV ES,AX
LEA DX,SOURCE ;数据区起始地址
LEA SI,NAME0 ;原始数据文件名
MOV CX,N ;字节数
CALL LOAD ;从'INPUT1.DAT'中读取数据
;****BEGIN****
LEA BX,SOURCE
MOV SI,N-2
ADD BX,SI
MOV SI,0
MOV AL,X
LP: CMP ,[BX+SI]
JGE INS
MOV DL,[BX+SI]
MOV [BX+SI+1],
DEC
JMP LP
INS: MOV ,AL
CLD
LEA SOURCE
LEA RESULT
MOV CX,N
MOVSB
;****END****
LEA DX,RESULT ; 结果数据区首地址
LEA SI,NAME1 ; 结果文件名
MOV CX,N ; 字节数
CALL SAVE ; 保存结果到文件
RET
START ENDP
CSEG ENDS
END START
(2)试编制程序,其功能是:对内存中存放的6组带符号16位二进制数(每组由3个数组成,均不为零)进行处理。处理方法为:当每组中负数多于正数时,将组内负数变成正数(但绝对值不变,下同),组内正数不变;反之,将组内正数变成负数,组内负数不变;变换好的数按原序存放在内存中。
例如:
内存中有0003H,0001H,0002H,0003H,0004H,FFFFH,FFFEH,FFFDH,0001H,FFFEH,
FFFDH,FFFFH…(共6组18个数),结果为FFFDH,FFFFH,FFEH,FFFDH,FFFCH,FFFFH,
0002H,0003H,0001H,0002H,0003,0001H…(共18个数)。
EXTRN LOAD:FAR,SAVE:FAR
N EQU 18
STAC SEGMENTSTACK
DB 128 DUP(?)
STAC ENDS
DATA SEGMENT
SOURCE DW N DUP(?)
RESULT DW N DUP(0)
NAME0 DB 'INPUT1.DAT',0
NAME1 DB 'OUTPUT1.DAT',0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STAC
START PROC FAR
PUSH DS
XOR AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
LEA DX,SOURCE ; 数据区起始地址
LEA SI,NAME0 ; 原始数据文件名
MOV CX,N*2 ; 字节数
CALL LOAD ; 从'INPUT1.DAT'中读取数据
;****BEGIN****
MOV SI,0
MOV DI,0
MOV BX,6
REPT1: MOV DX,0
CAMP: MOV AX,SOURCE[SI]
CMP AX,0
JL CONT
JMP NEXT
CONT: INC DX
NEXT: LOOP CAMP
SUB SI,6
MOV CX,3
CMP DX,2
JAE NEG1
NEXT1
NEG1: MOV AX,SOURCE[SI]
CMP AX,0
JL NEG2
JMP NOTNEG
NEG2:
NOTNEG: MOV RESULT[DI],AX
LOOP NEG1
JMP NEXT2
NEXT1: MOV AX,SOURCE[SI]
CMP AX,0
JG NEG3
JMP NOTNEG1
NEG3: NEG AX
NOTNEG1:MOV RESULT[DI],AX
LOOP NEXT1
NEXT2: DEC BX
JZ EXIT
EXIT: NOP
;****END****
LEA DX,RESULT ; 结果数据区首地址
LEA SI,NAME1 ; 结果文件名
MOV CX,N*2 ; 字节数
CALL SAVE ; 保存结果到文件
RET
START ENDP
CODE ENDS
END START
(3)试编制程序,其功能是:将内存中的20个有符号字节数据依次除以5,并按照四舍五入原则(即余数绝对值的2倍小于除数,则舍去)将商存入指定的内存区域。
例如:
内存中有10H,01H,27H,00H,FFH,F8H…,结果为03H,00H,08H,00H,00H,FEH…。
EXTRN LOAD:FAR,SAVE:FAR
N EQU 20
X EQU 5
DSEG SEGMENT
SOURCE DB N DUP(?)
RESULT DB N DUP(0)
NAME0 DB 'INPUT1.DAT',0
NAME1 DB 'OUTPUT1.DAT',0
DSEG ENDS
SSEG SEGMENT STACK
DB 256 DUP(?)
SSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,SS:SSEG,DS:DSEG
START PROC FAR
PUSH DS
XOR AX,AX
PUSH AX
MOV AX,DSEG
MOV DS,AX
LEA DX,SOURCE ; 数据区起始地址
LEA SI,NAME0 ; 原始数据文件名
MOV CX,N ; 字节数
CALL LOAD ; 从'INPUT1.DAT'中读取数据
;****BEGIN****
LEA SI,SOURCE
LEA DI,RESULT
CONT: LODSB
CBW
MOV DL,X
IDIV DL
JNS PLUS
ADD AH,AH
CMP AH,DL
JB
SUB AL,1
JMP NEXT
PLUS: ADD
CMP AH,DL
JB NEXT
NEXT: CMP SI,N
JB CONT
;****END****
LEA DX,RESULT ; 结果数据区首地址
LEA SI,NAME1 ; 结果文件名
MOV CX,N ; 结果字节数
CALL SAVE ; 保存结果到文件
RET
START ENDP
CSEG ENDS
END START