概述
首先
在学习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变量里存着输入的数值
最后
以上就是尊敬野狼为你收集整理的8086汇编 字符串数字转数字的全部内容,希望文章能够帮你解决8086汇编 字符串数字转数字所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复