汇编语言设计-实验四

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值