1.试分析下列程序段:
ADD AX,BX
JNC L2
SUB AX,BX
JNC L3
JMP SHORT L5
如果 AX,BX的内容给定如下:
AX BX
( 1) 14C6H 80DCH
( 2) B568H 54B7H
问该程序在上述情况下执行后,程序转向何处?
解:
( 1)转向 L2
因为( AX) +( BX)没有进位。
( 2)转向 L5
因为( AX) +( BX) = 0A1FH,有进位。
然后( AX) -( BX)有进位。
2,编写程序,使用三种以上的方法,将存储器中 2000H开始的地址单元中的 100字节数据复制到 3000H开始的存储器地址单元中。
( 1)利用通用传送指令 MOV
MOV SI,2000H
MOV DI,3000H
MOV CX,100
AA,MOV AL,[SI]
MOV [DI],AL
INC SI
INC DI
LOOP AA
HLT
( 2)利用交换指令
XCHG
MOV SI,2000H
MOV DI,3000H
MOV CX,100
AA,MOV AL,[SI]
XCHG [DI],AL
INC SI
INC DI
LOOP AA
HLT
( 3)利用换码指令 XLAT
MOV BX,2000H
MOV DI,3000H
MOV CX,100
AA,XOR AL,AL
XLAT
MOV [DI],AL
INC BX
INC DI
LOOP AA
HLT
( 4)利用堆栈实现数据传送
MOV SI,2000H
MOV DI,3000H
MOV CX,50
AA,PUSH [SI]
POP [DI]
INC SI
INC SI
INC DI
INC DI
LOOP AA
HLT
( 5)利用串操作指令 REP MOVSB
MOV SI,2000H
MOV DI,3000H
MOV CX,100
CLD ; DF=0,SI,DI自动 +1
REP MOVSB
HLT
3,在 DATA开始的 4个单元中存放着一个 32位数,求出其中的,1”
的个数,并存入 COUNT单元中。
DATA SEGMENT
DATA1 DB FEH,86H,7CH,35H
COUNT DB 00H
DATA ENDS
STACK SEGMENT
DB 100 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS,CODE,DS,DATA,SS,STACK
START,MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
MOV SI,OFFSET DATA1
MOV BX,[SI]
MOV DX,[SI+2]
MOV CX,16
XOR AL,AL
LP1,RCR DX
JNC LP2
INC AL
LP2,LOOP LP1
MOV CX,16
LP3,RCR BC
JNC LP4
INC AL
LP4,LOOP LP3
MOV COUNT,AL
MOV AH,4CH
INT 21H
HLT
6,下段程序完成后,AH等于什么?
IN AL,5FH
TEST AL,80H
JZ L1
MOV AH,0
JMP STOP
L1,MOV AH,0FFH
STOP,HLT
如果地址为 5FH的外设输入到 AL中的数据的最高位 =1,则
( AH) = 0,否则,( AH) = 0FFH。
13,将键盘上输入的一位为十六进制数转换成十进制数,在屏幕上显示。
DATA SEGMENT
DATA1 DB 10 DUP(?)
DATA2 DB 10 DUP(?)
DATA ENDS
STACK SEGMENT
DB 100 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS,CODE,DS,DATA,SS,STACK
START,PUSH DS
MOV AX,DATA
MOV DS,AX
KEY,MOV AH,1
INT 21H
例如:输入 01H 输出 01
输入 0AH 输出 10
ZH,CMP AL,3AH ;比较输入的 ASCII码
JL ZH1 ;若为 0~ 9 比如,1”
SUB AL,30H ;若为 A~ F,需要进行调整
,A”
ADD AL,06H ; AL= 10H
JMP ZH2
ZH1,SUB AL,30H ; AL= 01H
ZH2,MOV BL,AL ; BL= 10H
ZH5,AND AL,0F0H ; AL= 00H,10H
SHR AL,4 ; AL= 00H,01H
ADD AL,30H ; AL= 30H,31H
MOV BH,AL ;暂存高位,BL= 30H,31H
MOV AL,BL ; AL= 01H,10H
AND AL,0FH ; AL=01H,00H
ADD AL,30H ; AL= 31H,30H
MOV BL,AL ;暂存低位,BL= 31H,30H
DISP,MOV DL,BH ;高位显示 0,1
MOV AH,2
INC 21H
MOV DL,BL ;低位显示 1,0
MOV AH,2
INC 21H
MOVAH,4CH ;返回 DOS
INT 21H
HLT
CODE ENDS
END
22,编程序统计学生的数学成绩,分别归类 90~ 99分,80~ 89分,
70~ 79分,60~ 69分及 60分以下,并将各段的人数送入内存单元中。
DATA SEGMENT
DATA1 DB 200 DUP(?) ;输入的数据,以 ASCII形式存放
DATA2 DB 100 DUP(?) ;处理后的数据存放
DATA3 DB 10 DUP(?) ;统计各分数段的个数
DATA ENDS
STACK SEGMENT
DB 100 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS,CODE,DS,DATA,SS,STACK
START,PUSH DS
MOV AX,DATA
MOV DS,AX
XOR CX,CX
KEY,MOV SI,OFFSET DATA1
MOV AH,1 ;读取数据存放到 AL(ASCII)中,
INT 21H ; 39H,33H,实际上是 93分
CMP AL,‘ $’ ;是否是结束字符
JZ ZH
INC CX ;数据数加 1
MOV [SI],AL ;把数据存放到 DATA1单元
INC SI ;修改指针
JMP KEY
ZH,MOV SI,OFFSET DATA1
MOV DI,OFFSET DATA2
SHR CX 1 ;实际数据数是输入的一半
PUSH CX
ZH1,MOV AL,[SI] ; 39H(ASCII)――90
AND AL,0FH
SHL AL,4
MOV BL,AL
INC SI
MOV AL,[SI]
AND AL,0FH ; 33H(ASCII)――03
OR AL,BL ;变成 93
MOV [DI],AL ;处理完数据存放到 DATA2开始的单元
INC SI
LOOP ZH1
TJ,POP CX
TJ0,MOV AL,[DI]
CMP AL,90
JNL TJ1
CMP AL,80
JNL TJ2
CMP AL,70
JNL TJ3
CMP AL,60
JNL TJ4
INC 4[DATA3]
JMP TJ5
TJ1,INC [DATA3] ; 90分以上
JMP TJ5
TJ2,INC 1[DATA3] ; 80~ 89分之间
JMP TJ5
TJ3,INC 2[DATA3] ; 70~ 79分之间
JMP TJ5
TJ4,INC 3[DATA3] ; 60~ 69分之间
TJ5,INC DI
LOOP TJ0
MOV AH,4CH ;返回 DOS
INT 21H
HLT
CODE ENDS
END