8086汇编 字符串数字转数字

  首先

在学习8086汇编语言过程中会发现,8086汇编语言不能直接输入数字,只能输入字符串或字符。因为在8086汇编中,所有字符都是以ASCII值形式存储得。就好比C语言中的char 数据类型,然而事实上8086汇编中只有char类型,并没有像C语言int类型或者float类型。所以输入数字必须将输入的字符串转换数字,储存在通用寄存器中或者主存中。这里暂且说说如何将输入的整数字符串转换为整数。对于这个问题。我想到了两个思路

一.(多项式计算)

第一种思路比较简单,就是通过计算位权将其转换为数值,正向读取字符串。例如

通过这个思路就可以写出一个循环,即可以将输入的数字转换为数值,进行运算了。

但是这个这个思路有两个缺点便是,一是要计算10的n次幂,二是要计算输入数字的位数。并且,同时输入多个数字时,找到每个数字的位数,更要费些无用功。

所以我就想到了,倒着查找,从字符串的末尾往前读入,便忽略掉位数这个问题。在输入多个数字时也不会受到影响。

DATAS SEGMENT
 BUF DB 10H 
     DB 0
     DB 10H DUP(?) 
 NUM DW  0
 I   DB  0
DATAS ENDS

STACKS SEGMENT PARA STACK
  DB 20H DUP(?)
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
   
    MOV AH,0AH
    LEA DX,BUF
    INT 21H
    MOV CX,0
    MOV CL,BUF[1]
    MOV SI,1
    ADD SI,CX
    MOV AX,0
    MOV BX,10
    MOV DX,0
LOP:PUSH BX
    MOV AL,BUF[SI]
    SUB AL,30H
    MOV I,BH
    MOV BH,0
LOP1:
    CMP I,0
    JE NEXT
    DEC I
    MUL BX
    JMP LOP1
NEXT:
    POP BX
    INC BH
    ADD NUM,AX
    MOV AX,0
    MOV DX,0
    DEC SI
    LOOP  LOP
    
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

当然进行调试之后,就会发现在num中就会存入你输入的数值了,当然上面的程序是有许多的缺陷的。

二.(秦九韶算法计算)

第二种思路便是逐步计算

这个思路比第一种简便了许多,不需要知道数的位数,也不需要知道当前数的位权。能够计算任何位的数(二进制32位以内应该是可行的)

简单样例代码如下

DATAS SEGMENT
BUF1 DB 20H
     DB  0
     DB 20H DUP(0)
NUM  DW  ?
DATAS ENDS
   
STACKS SEGMENT PARA STACK
   DW 30H DUP(0)
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
   
  	MOV AH,0AH
    LEA DX,BUF1
    INT 21H
    CALL STOI
    
    MOV AX,0
    MOV AH,4CH
    INT 21H
STOI PROC 
	MOV DX,0
	MOV BX,10
	MOV SI,2
	MOV NUM,0
	MOV AX,0
LOP:
    MOV AL,BUF1[SI]
    CMP AL,0DH
    JE  FINAL
    SUB AL,30H
    CMP NUM,0
    JE  DO_DEAL 
    PUSH AX
    MOV AX,NUM
    MUL BX 
    MOV  NUM,AX  
    POP AX
DO_DEAL:
    ADD NUM,AX
    MOV AX,0
    INC SI
    JMP LOP
FINAL:    
RET
STOI ENDP
CODES ENDS
    END START

通过调试便可以看到num变量里存着输入的数值

  • 10
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值