1. 输入 5 为以内的八进制数,存入 BX 中。注意:BX 中的最高位(即第 15 位)如何输入?
S1 SEGMENT STACK
DW 30H DUP(0)
TOP LABEL WORD
S1 ENDS
S3 SEGMENT
ASSUME CS:S3,SS:S1
MAIN PROC FAR
MOV AX,S1
MOV SS,AX
LEA SP,TOP
MOV AX,S2
MOV DS,AX
XOR BX,BX
MOV CH,5
L1: MOV AH,1
INT 21H
CMP AL,0DH
JE L2 ;判断是否为回车符
CMP AL,'0'
JB L1 ;比0小
CMP AL,'7'
JA L1 ;比7大
MOV CL,3 ;初始化移动位数
ROL BX,CL
AND AL,07H
ADD BL,AL ;不可以写为ADD BX,AX
LOOP L1
;或者
;DEC CH ;等价于CH--
;JNZ L1 ;当ZF为1,即CH=0时跳转
L2: MOV AH,4CH
INT 21H
MAIN ENDP
S3 ENDS
END MAIN
2. 输入两个字数据(16 位的数)X,Y,计算 Z=X+Y,并把 Z 的结果显示出来。(程序采用EXE 格式)。提示:X,Y 的输入可以是任何进制。
;输入两个16位二进制数,计算Z=X+Y,把Z以八进制输出
S1 SEGMENT STACK
DW 30H DUP(0)
TOP LABEL WORD
S1 ENDS
S2 SEGMENT
X DW ?
Y DW ?
Z DW ?
S2 ENDS
S3 SEGMENT
ASSUME CS:S3,DS:S2,SS:S1
MAIN PROC FAR
MOV AX,S1
MOV SS,AX
LEA SP,TOP
MOV AX,S2
MOV DS,AX
MOV CX,0
XOR BX,BX
;输入两个数
L3: CMP CX,2
JE L2 ;判断是否加了两次
PUSH CX
MOV CX,16
L1: MOV AH,1
INT 21H
CMP AL,'0'
JB L1
CMP AL,'1'
JA L1
SHL BX,1
AND AL,01H
ADD BL,AL
LOOP L1
;判断当前输入的是x还是y
POP CX
CMP CX,0
JA NEXT_1
MOV [X],BX
INC CX
JMP L3 ;无条件跳转
NEXT_1:MOV [Y],BX
;做加法
L2: MOV AX,[X]
ADD AX,[Y]
MOV [Z],AX
MOV CX,5 ;循环左移5次,八进制输出
MOV BX,[Z]
;最高位单独输出
ROL BX,1
MOV DL,BL
AND DL,1
ADD DL,30H
MOV AH,2
INT 21H
;输出后五位
L4: PUSH CX
MOV CL,3
ROL BX,CL
MOV AL,BL
AND AL,07H
ADD AL,30H
MOV DL,AL
MOV AH,2
INT 21H
POP CX
LOOP L4
MOV AH,4CH
INT 21H
MAIN ENDP
S3 ENDS
END MAIN
3. 输入一个有符号的十进制数,并以十六进制输出
S1 SEGMENT STACK
DW 30H DUP(0)
TOP LABEL WORD
S1 ENDS
S2 SEGMENT
FLAG DB 0
NUM DW ?
S2 ENDS
S3 SEGMENT
ASSUME CS:S3,DS:S2,SS:S1
MAIN PROC FAR
MOV AX,S1
MOV SS,AX
LEA SP,TOP
MOV AX,S2
MOV DS,AX
XOR BX,BX
XOR CX,CX
;检查是否为负数
MOV AH,1
INT 21H
CMP AL,'-'
JNE L1 ;不相等就跳转
MOV FLAG,1
L1: MOV AH,1
INT 21H
CMP AL,0DH
JE NEXT_1 ;为回车符号就下一步
CMP AL,'0'
JB L1
CMP AL,'9' ;要与字符比较,而不是数字
JA L1
SUB AX,30H
AND AX,0FH ;取后四位,同时将字符转化为数字类型
XCHG AX,BX ;AX是原来的数字
MOV SI,10
MUL SI
JC EXIT ;检查是否溢出,溢出就退出
ADD BX,AX
JC EXIT
JMP L1
;取出符号位
NEXT_1:
CMP FLAG,0
JE NEXT_2 ;为正数就跳转
NEG BX ;取补码
NEXT_2:
MOV CX,4
;输出结果,循环输出4次
L2: PUSH CX
MOV CL,4
ROL BX,CL
MOV DL,BL
AND DL,0FH
CMP DL,9 ;输出与数字比较
JA L3 ;若为A-F
ADD DL,'0'
JMP OUT_PUT
L3: ADD DL,37H
OUT_PUT:
MOV AH,2
INT 21H
POP CX
LOOP L2
EXIT:
MOV AH,4CH
INT 21H
MAIN ENDP
S3 ENDS
END MAIN
- 要点一:最好不要用CX存符号标记位,因为CX作为寄存器,数值容易发生改变
- 要点二:正数输入时候要带符号,否则会吃掉一个字符
4. 习题5.4
S1 SEGMENT STACK
DW 30H DUP(0)
TOP LABEL WORD
S1 ENDS
S2 SEGMENT
MESS1 DB 'HELLOW!WORLD'
MESS2 DB 'HELLOW!LIHUA'
EQUAL DB 'MATCH$'
NOTEQUAL DB 'NO MATCH$'
S2 ENDS
S3 SEGMENT
ASSUME CS:S3,DS:S2,SS:S1
MAIN PROC FAR
MOV AX,S1
MOV SS,AX
LEA SP,TOP
MOV AX,S2
MOV DS,AX
MOV SI,OFFSET MESS1
MOV DI,OFFSET MESS2
MOV CX,12
CLD
REPE CMPSB
JNZ L1 ;比较结果不相等
JCXZ L1
L1: MOV DX,OFFSET NOTEQUAL
OUTPUT:
MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H
MAIN ENDP
S3 ENDS
END MAIN
5. 习题5.10
S1 SEGMENT STACK
DW 30H DUP(0)
TOP LABEL WORD
S1 ENDS
S2 SEGMENT
ENG DB 'SUNABDSUNJDJKSUNKL$' ; 测试字符串(包含3个SUN)
STR1 DB 'SUN'
DSTR1 DB 'SUN' ;该串加上count就是显示结果
COUNT DB 0 ; 计数器初始化为0
S2 ENDS
S3 SEGMENT
ASSUME CS:S3, DS:S2, SS:S1
MAIN PROC FAR
MOV AX, S1
MOV SS, AX
LEA SP, TOP
MOV AX, S2 ;数据段
MOV DS, AX
MOV ES, AX
; 初始化搜索
MOV DI, OFFSET ENG ; SI指向字符串起始
CLD ;DF=0
L1: LEA SI,STR1
;扫描是否有SUN匹配
MOV CX,3
REPZ CMPSB
JNE L2
JCXZ ADD1 ;说明完全匹配
JMP L2 ;说明不完全匹配
ADD1:
INC COUNT ;SUN匹配一次
L2: XOR BX,BX
MOV BL,ES:[DI]
CMP BL,24H
JE DISP
LOOP L1
DISP:
MOV DL,0DH
MOV AH,2
INT 21H
MOV AX,30H
ADD COUNT,AL
LEA BX,DSTR1
MOV CX,5
L3: MOV DX,[BX]
MOV AH,2
ADD BX,1
INT 21H
LOOP L3
; 程序结束
MOV AH, 4CH
INT 21H
MAIN ENDP
S3 ENDS
END MAIN
1685

被折叠的 条评论
为什么被折叠?



