首先
在学习8086汇编语言过程中会发现,8086汇编语言不能直接输入数字,只能输入字符串或字符。因为在8086汇编中,所有字符都是以ASCII值形式存储得。就好比C语言中的char 数据类型,然而事实上8086汇编中只有char类型,并没有像C语言int类型或者float类型。所以输入数字必须将输入的字符串转换数字,储存在通用寄存器中或者主存中。这里暂且说说如何将输入的整数字符串转换为整数。对于这个问题。我想到了两个思路
一.(多项式计算)
第一种思路比较简单,就是通过计算位权将其转换为数值,正向读取字符串。例如
通过这个思路就可以写出一个循环,即可以将输入的数字转换为数值,进行运算了。
但是这个这个思路有两个缺点便是,一是要计算10的n次幂,二是要计算输入数字的位数。并且,同时输入多个数字时,找到每个数字的位数,更要费些无用功。
所以我就想到了,倒着查找,从字符串的末尾往前读入,便忽略掉位数这个问题。在输入多个数字时也不会受到影响。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52DATAS 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位以内应该是可行的)
简单样例代码如下
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53DATAS 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汇编内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复