首先
在学习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位以内应该是可行的)
以上便是本人的拙见。