本章介绍了计算机指令的格式、微机的寻址方式,重点介绍了80x86指令系统的多种指令。
1.填空题
(1)假设(AL)=26H,(BL)=55H,依次执行ADD AL,BL和DAA指令后,(AL)= 。
(2)在MOV WORD PTR[0072],55AAH的指令的机器代码中,最后一个字符内容是 。
(3)MOV SI,[BX]指令形成源操作数的物理地址时,默认的段寄存器是 。
(4)假设AL寄存器中的内容是7FH,执行指令ADD AL,2后,符号标志SF和进位标志CF的状态分别是 。
(5)若定义DAT DB '1234',执行指令MOV AX,WORD PTR DAT后,AX寄存器中的内容是 。
(6)假设(SP)=0100H,(SS)=2000H,执行PUSH BX指令后,栈顶的物理地址是 。
2.选择题
(1) 都属于计算机的低级语言。
A.机器语言和高级语言 B.机器语言和汇编语言
C.汇编语言和高级语言 D.高级语言和数据库语言
(2)REPZ指令作为下面哪一条串操作指令的前缀时才能完全发挥它的功能 。
A.MOVSB B.STOSB C.LODSW D.CMPSW
(3)执行下面的程序段后,AL寄存器中的内容应该是 。
MOV AL,03H
MOV BL,09H
SUB AL,BL
AAS
A.0FAH B.04H C.06H D.86H
(4)假设VAR为变量,指令MOV BX,OFFSET VAR的寻址方式是 。
A.直接寻址 B.间接寻址 C.立即寻址 D.存储器寻址
(5)若X和Y均为无符号整数,且X≤Y,则依次执行MOV AX,X和CMP AX,Y指令后,标志位CF和ZF的状态是 。
A.CF=0且ZF=0 B.CF=1且ZF=1
C.CF=0或ZF=0 D.CF=1或ZF=1
(6)假设AL寄存器的内容是ASCII码表示的一个英文字母,若为大写字母,将其转换为小写字母,否则不变。下面 指令可以实现此功能。
A.ADD AL,20H B.OR AL,20H
C.ADD AL,'a'-'A' D.XOR AL,2
(7)下列指令中有语法错误的是 。
A.SHL AX,CL B.MOV AX,[DX]
C.OUT DX,AL D.MOV EAX,[EDX]
3.上机操作题
(1)试编制程序,其功能是:内存中共有30个字节型数据,找出其中的两个ASCII字符串并进行校验。欲寻找的ASCII字符串由13个字符组成:#(23H)、7个ASCII字符、*(2AH)、2个ASCII字符、回车符(0DH)、换行符(0AH)。
校验方法为:对字符#及字符*之间的7个ASCII字符进行异或操作,若异或操作结果的ASCII字符表示(异或操作结果高4位的ASCII字符表示在前,低4位的ASCII字符表示在后)与原字符串中字符*之后的两个ASCII字符相同,则将原字符串原样保存;反之,则将原字符串中的所有字符(共13个)均用字符!(21H)代替。
例如:
内存中有33H,35H,23H(‘#’,第一个字符串开始),46H,41H,30H,2EH,34H,3DH,31H,2AH(‘*’),32H,31H,0DH,0AH,46H,23H(‘#’,第二个字符串开始),46H,41H,30H,2EH,34H,3DH,
30H,2AH(‘*’),32H,31H,0DH,0AH,55H, 结果为23H,46H,41H,30H,2EH,34H,3DH,31H,2AH(‘*’),32H,31H(校验正确,该字符串原样保持), 0DH,0AH,21H,21H,21H,21H,21H,21H,21H,
21H,21H,21H,21H,21H,21H(校验错,整个字符串用字符!代替)。
EXTRN LOAD:FAR,SAVE:FAR
N EQU 26
STAC SEGMENTSTACK
DB 128 DUP(?)
STAC ENDS
DATA SEGMENT
SOURCE DB N+4 DUP(?)
RESULT DB N DUP(0)
HH DB 2 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+4 ; 字节数
CALL LOAD ; 从'INPUT1.DAT'中读取数据
;****BEGIN****
MOV SI,0
MOV DI,0
MOV BX,2 ; 两个ASCII字符串
REPEAT: MOV AH,0
SEARCH: MOV AL,SOURCE[SI]
INC SI
CMP AL,'#'
SEARCH
MOV RESULT[DI],AL
INC DI
SEARCH1:MOV AL,SOURCE[SI]
INC SI
CMP AL,
JE ASCII
MOV RESULT[DI],AL
INC DI
XOR AH,AL
JMP
ASCII: MOV RESULT[DI],AL
INC DI
PUSH DI
MOV DI,0
MOV DH,2
MOV DL,AH ; 异或结果暂存在DL中
MOV CL,4 ; 先将异或结果高4位转换成ASCII字符
SHR AH,CL ; 本行开始的4行语句将一个十六进制数转换为ASCII码
CHANGE: CMP AH,10
JL ADD_0
ADD AH,’A’-’0’-10
ADD_0: ADD AH,’0’
MOV HH[DI],AH
INC DI
DEC DH
JZ EXT
MOV AH,DL ; 再将异或结果低4位转换成ASCII字符
AND AH,0FH
JMP CHANGE
EXT: POP DI
MOV AL,SOURCE[SI]
MOV RESULT[DI],AL
INC SI
INC DI
MOV AH,SOURCE[SI]
MOV RESULT[DI],AH
INC SI
INC DI
MOV DL,HH
MOV DH,HH+1
CMP AX,DX
ERR
MOV AL,0DH ; 校验正确
MOV RESULT[DI],AL
INC DI
MOV AL,0AH
MOV RESULT[DI],AL
INC DI
JMP LP
ERR: SUB DI,11 ; 校验错误
MOV AL,'!'
MOV CX,
COVER: MOV RESULT[DI],AL
INC DI
LOOP COVER
LP:
JZ EXIT
JMP REPEAT
EXIT: NOP
;****END****
LEA DX,RESULT ; 结果数据区首址
LEA SI,NAME1 ; 结果文件名
MOV CX,N ; 字节数
CALL SAVE ; 保存结果到文件
RET
START ENDP
CODE ENDS
END START
(2)试编制程序,其功能是:内存中连续存放的20个8位无符号数是一个自动抄表仪抄录的20个用户某月的用水量(立方米),为了控制用水量,水费计算公式如下(X表示用水量;Y表示水费,单位为分)。
Y=X*70 X<=5
Y=X*100 5<X<=20
Y=X*150 X>20
例如:
用水量(X)为04H, 10H, 18H…,水费(Y)为0118H,0640H,0E10H…。
试计算出这20个用户应缴纳的水费,结果用字(WORD)表示。
EXTRN LOAD:FAR,SAVE:FAR
N EQU 20
STAC SEGMENT STACK
DB 128 DUP(?)
STAC ENDS
DATA SEGMENT
SOURCE DB 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 ; 字节数
CALL LOAD ; 从'INPUT1.DAT'中读取数据
;****BEGIN****
LEA SI,SOURCE
LEA DI,RESULT
CLD
MOV CX,N
MOV BL,70
MOV BH,100
MOV DL,150
NEXT:
CMP AL,5
J GT5
JMP STORE
GT5: CMP AL,20
J GT20
JMP STORE
GT20:
STORE: MOV [DI],AX
LOOP NEXT
;****END****
LEA DX,RESULT ; 结果数据区首址
LEA SI,NAME1 ; 结果文件名
MOV CX,N*2 ; 字节数
CALL SAVE ; 保存结果到文件
RET
START ENDP
CODE ENDS
END START
(3)试编制程序,其功能是:一个故障报警系统连续集20个字节数据存于SOURCE开始的内存区域,如果数据字节中有二进制位0(0代表有故障),则记录该数据字节中0的个数,并按数据字节在前,0的个数在后的顺序存放到RESULT开始的内存区域。
例如:
内存中有FEH,90H,FFH,DDH…,结果为FEH,01H,90H,06H,FFH,00H,DDH,02H…。
EXTRN LOAD:FAR,SAVE:FAR
N EQU 20
ESC_CODE EQU 27
STAC SEGMENT STACK
DB 128 DUP(?)
STAC ENDS
DATA SEGMENT
SOURCE DB N DUP(?)
RESULT DB N*2 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
MOV ES,AX ; 置附加段寄存器
LEA DX,SOURCE ; 数据区起始地址
LEA SI,NAME0 ; 原始数据文件名
MOV CX,N ; 字节数
CALL LOAD ; 从'INPUT1.DAT'中读取数据
;****BEGIN****
LEA SI,SOURCE
MOV DI,OFFSET RESULT
CLD
MOV DL,N
LP1: ; 字节数计数器DL
MOV [DI],AL
MOV CX,
MOV DH,0
LP2: AL,1
JC
INC DH
LP3: LP2
INC DI
MOV [DI],
JNZ
;****END****
LEA DX,RESULT ; 结果数据区首址
LEA SI,NAME1 ; 结果文件名
MOV CX,N*2 ; 字节数
CALL SAVE ; 保存结果到文件
RET
START ENDP
CODE ENDS
END START