汇编-第五章例题

5.2 在ADDR单元中存放着数Y的地址,试编制一个程序,把Y中1的个数存入COUNT单元中

要点1:JZ EXIT和JNS SHIFT的使用

DATAS SEGMENT
	COUNT DW 0
	ARRD DW NUMBERY
	NUMBERY DW 003FH
	
DATAS ENDS

STACKS SEGMENT
	DW 30H DUP(0)
	TOP LABEL WORD
STACKS ENDS

CODES SEGMENT
	ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
	MOV AX,DATAS
	MOV DS,AX
	MOV AX,STACKS
	MOV SS,AX
	LEA SP,TOP
	
	MOV BX,ARRD
	MOV AX,[BX] ;取NUMBERY的内容
	
L1:	TEST AX,0FFFFH 
	JZ EXIT   ;检查当前数字是否全为0,全为0则结束
	JNS SHIFT ;检查当前最高位是否为0,若为0就跳转
	INC COUNT
	
SHIFT:
	SHL AX,1 
	JMP L1
	
EXIT:		
	MOV DX,COUNT
	ADD DX,30H
	MOV AH,02H
	INT 21H

	MOV AH,4CH
	INT 21H
CODES ENDS
	END START

 输出:

以二进制输出

S1		SEGMENT	STACK
		DW	30H DUP(0)
TOP		LABEL	WORD
S1		ENDS
S2		SEGMENT
NUM		DW	6B3DH
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	BX,NUM
		MOV	CX,16
NEXT:	XOR	DL,DL ;注意清零!!
		ROL	BX,1
		ADC	DL,30H ;带进位加法,结合左移
		MOV	AH,2
		INT	21H
		LOOP	NEXT
		MOV	AH,4CH
		INT	21H
MAIN	ENDP
S3		ENDS
		END	MAIN

以八进制输出

要点一:一共十六位,最高位单独处理;剩余15位,呈3位一组输出

DATAS SEGMENT
	NUM DW 6751H
DATAS ENDS

STACKS SEGMENT 
	DW 30H DUP(0)
	TOP LABEL WORD
STACKS ENDS

CODES SEGMENT 
	ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
	MOV AX,DATAS
	MOV DS,AX
	MOV AX,STACKS
	MOV SS,AX
	LEA SP,TOP
	
L1: MOV BX,NUM
	ROL BX,1
	MOV DX,BX
	AND DX,1
	ADD DX,30H 
	MOV AH,02H
	INT 21H
	
	MOV CX,5
L2: PUSH CX
	MOV CL,3
	ROL BX,CL
	MOV DX,BX
	AND DX,07H
	ADD DX,30H
	MOV AH,02H
	INT 21H
	POP CX
	LOOP L2
	
	MOV AX,4CH
	INT 21H
CODES ENDS
	END START

以十进制输出

DATAS SEGMENT
	NUM DW 0012H
	COUNT DW 0
DATAS ENDS

STACKS SEGMENT 
	DW 30H DUP(0)
	TOP LABEL WORD
STACKS ENDS

CODES SEGMENT 
	ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
	MOV AX,DATAS
	MOV DS,AX
	MOV AX,STACKS
	MOV SS,AX
	LEA SP,TOP
	
	;除10取余法
	MOV AX,NUM
	MOV DI,10
L1: CMP AX,0
	JE NEXT ;若商为0
	MOV DX,0 ;保证每次被除数都是正确的,因为DX:AX / DI
	DIV DI
	PUSH DX
	INC COUNT
	JMP L1
NEXT:
	MOV CX,COUNT
PRINT:
	POP DX
	ADD DX,30H
	MOV AH,02H
	INT 21H
	LOOP PRINT
CODES ENDS
	END START

输入:

输入16位二进制 并存在NUM中

DATAS SEGMENT
	NUM DW ?
DATAS ENDS

STACKS SEGMENT 
	DW 30H DUP(0)
	TOP LABEL WORD
STACKS ENDS

CODES SEGMENT 
	ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
	MOV AX,DATAS
	MOV DS,AX
	MOV AX,STACKS
	MOV SS,AX
	LEA SP,TOP
	
    ;输入16位二进制数
	MOV BX,0
	MOV CX,16
L1:	MOV AH,01H
	INT 21H
	CMP AL,0DH
	JE NEXT
	CMP AL,'0'
	JB L1
	CMP AL,'1'
	JA L1
	ROL BX,1
	SUB AL,30H  ;转化为数值
	MOV AH,0
	ADD BX,AX
	LOOP L1
	
	;8进制输出验证
NEXT:
	MOV [NUM],BX
	MOV AH,02H
	MOV DL,0AH
	INT 21H
	
	ROL BX,1
	MOV DX,BX
	AND DX,1
	ADD DX,30H 
	MOV AH,02H
	INT 21H
	
	MOV CX,5
L2: PUSH CX
	MOV CL,3
	ROL BX,CL
	MOV DX,BX
	AND DX,07H
	ADD DX,30H
	MOV AH,02H
	INT 21H
	POP CX
	LOOP L2
	
EXIT:
	MOV AH,4CH
	INT 21H
CODES ENDS
	END START

 输入5位八进制数

DATAS SEGMENT
	NUM DW ?
DATAS ENDS

STACKS SEGMENT 
	DW 30H DUP(0)
	TOP LABEL WORD
STACKS ENDS

CODES SEGMENT 
	ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
	MOV AX,DATAS
	MOV DS,AX
	MOV AX,STACKS
	MOV SS,AX
	LEA SP,TOP
	
	MOV BX,0
	MOV CX,5
L1:	PUSH CX
	MOV AH,01H
	INT 21H
	CMP AL,0DH
	JE NEXT
	CMP AL,'0'
	JB L1
	CMP AL,'7'
	JA L1
	MOV CL,3
	ROL BX,CL
	SUB AL,30H ;转化为数值
	MOV AH,0
	ADD BX,AX
	POP CX
	LOOP L1
	
	;存储在NUM中
NEXT:
	MOV [NUM],BX
	MOV AH,02H
	MOV DL,0AH
	INT 21H
	;8进制输出验证
	MOV CX,5
L2: PUSH CX
	MOV CL,3
	ROL BX,CL
	MOV DX,BX
	AND DX,07H
	ADD DX,30H
	MOV AH,02H
	INT 21H
	POP CX
	LOOP L2
	
EXIT:
	MOV AH,4CH
	INT 21H
CODES ENDS
	END START

输入16进制数/输出16进制数

DATAS SEGMENT
	NUM DW ?
DATAS ENDS

STACKS SEGMENT 
	DW 30H DUP(0)
	TOP LABEL WORD
STACKS ENDS

CODES SEGMENT 
	ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
	MOV AX,DATAS
	MOV DS,AX
	MOV AX,STACKS
	MOV SS,AX
	LEA SP,TOP
	
	;输入十六进制的数存到NUM中
	MOV BX,0
	MOV CX,4
L1:	PUSH CX
	MOV AH,01H
	INT 21H
	CMP AL,0DH
	JE NEXT
	CMP AL,'0'
	JB L1
	CMP AL,'7'
	JA L2
	SUB AL,30H
	JMP NEXT1
L2: ;判断是否为A-F或a-f
	CMP AL,'A'
	JB L1
	CMP AL,'Z'
	JBE L3
	CMP AL,'a'
	JB L1
	CMP AL,'z'
	JA L1
	SUB AL,20H
	
L3: SUB AL,37H
NEXT1:
	MOV CL,4
	ROL BX,CL
	MOV AH,0
	ADD BX,AX
	POP CX
	LOOP L1
	
	;存储在NUM中
NEXT:
	MOV [NUM],BX
	MOV AH,02H
	MOV DL,0AH
	INT 21H
	
	;16进制输出验证
	MOV CX,4
L4: PUSH CX
	MOV CL,4
	ROL BX,CL
	MOV DX,BX
	AND DX,0FH
	CMP DX,9   ;输出要和数字比较,而不是字符
	JBE NEXT2
	ADD DX,07H ;输出英文大写即可,不用分大小写
NEXT2:
	ADD DX,30H
	MOV AH,02H
	INT 21H
	POP CX
	LOOP L4
	
EXIT:
	MOV AH,4CH
	INT 21H
CODES ENDS
	END START

P170:例5.6 试编制一程序,从键盘输入一行字符,要求第一个键入的字符必须是空格,如不是,则退出程序;如是,则开始接收键入的字符并顺序存放在首地址为BUFFER的缓冲区中(空格符不存入),直到接收到第二个空格时退出程序。 

DATAS SEGMENT
    BUFFER DW 30 DUP(0) ;分清定义的类型DW还是DB,要和下面的BX加的统一
    FLAG DW 0
DATAS ENDS

STACKS SEGMENT
    DW 30H DUP(0)
    TOP LABEL WORD
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    MOV AX,STACKS
    MOV SS,AX
    LEA SP,TOP
    
    LEA BX,BUFFER
    
L1: MOV AH,01H
    INT 21H
	TEST FLAG,1
	JNZ NEXT     ;ZF=0,说明结果为1,说明两者相等
	CMP AL,20H   ;和空格比较
	JNE EXIT
	MOV FLAG,1
	JMP L1
NEXT:
	CMP AL,20H
	JZ EXIT
	MOV AH,0
	MOV [BX],AX
	ADD BX,2
	JMP L1
	
EXIT:
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值