8086汇编 字符串数字转数字

时间:2021-07-04 16:15:20

  首先

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

一.

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

8086汇编 字符串数字转数字

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

但是这个这个思路有两个缺点便是,一是要计算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中就会存入你输入的数值了,当然上面的程序有许多的缺陷。比如边界判定之类的

二.

第二种思路便是逐步计算

8086汇编 字符串数字转数字

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


以上便是本人的拙见。