(汇编)输入一个十进制数字串(无符号),以四位十六进制的形式输出

上汇编课,老师给我们出了一题:

输入一个十进制数字串(假定是无符号的),以四位十六进制的形式输出该串对应的值

想了一下,感觉好难,该怎么处理把字符串转换为十进制数,还有怎么把十进制数转换为十六进制,想了半天没有头

在网上搜了一下,看到了一个解法,(点击打开链接), 不过感觉有些代码略繁琐而且对一位的字符输入会有错误输出,算是一个bug,

于是忍不住进行了修改,修改了bug而且代码少了不少也清晰了很多: 


.386
STACK	SEGMENT	USE16	STACK
		DB 200 DUP(0)
STACK ENDS

DATA SEGMENT USE16
BUF1 DB  20
    DB   ?
    DB 20 DUP(0); buf1用来存储用户输入的字符串

BUF2 DB  20
    DB   ?
    DB 20 DUP(30H); buf2用来存储输出的结构  每个字节默认为字符'0'
INPUT DB 'Input:$'
OUTPUT DB 'Output:$'
CTRL DB 0DH,0AH,'$'; 提示语,换号符

X1  DW  0AH
X2  DW  10H  ; 进制转换用的乘法或者除法因子
DATA	ENDS

CODE	SEGMENT	USE16
ASSUME 	DS: DATA, CS: CODE, SS: STACK
START:	MOV	AX,	DATA
		MOV DS,	AX

		LEA DX,INPUT
		MOV AH,9
		INT 21H; 输出'input:'提示语
		LEA	DX,	BUF1
		MOV	AH, 10
		INT 21H; 把输入的存在buf1中
		LEA	DX, CTRL
		MOV AH, 9
		INT	21H; 输出回车换行

		MOV CL, BUF1+1; cl存储输入字符个数
		LEA SI, BUF1+2; 输入字符首地址
		MOV AX, 0

LOOPA:
		MUL [X1]
		MOV	BL, [SI]
		SUB BL, 30H; ascii 码转换为数字
		MOV	BH, 0
		ADD AX, BX
		INC SI
		DEC CL
		JNZ LOOPA
		; loopa 循环把输入的字符串转换为数字存到dx, ax中 dx为高字节,ax为低字节

		MOV CL, 0
LOOPB:
		DIV [X2]
		PUSH DX;入栈
		INC CL
		MOV DX, 0
		CMP AX, 0
		JNE LOOPB
		; loopb 循环把十进制转换为16进制数,每一16进制位压入栈

		MOV AL, 4
		SUB AL, CL
		MOV AH, 0
		LEA SI, BUF2+2
		ADD SI, AX
LOOPC:  
		POP AX
		CMP AX, 9
		JBE NUM
		ADD AX, 7H
NUM:	ADD AX, 30H
		MOV [SI], AX
		INC SI
		DEC CL
		JNE LOOPC
		; loopc 循环把栈中的16进制数字转换为ascii码存到buf2中


		MOV [SI], BYTE PTR 'H'
		INC SI
		MOV [SI], BYTE PTR '$'
		; buf2 的结尾加上'h$'

		LEA DX,OUTPUT
		MOV AH,9
		INT 21H; 输出'output'提示
		LEA	DX, BUF2
		MOV AH, 9
		INT	21H; 输出最终结果

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



  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值