大家都知道,从C语言开始,我们都摆脱不了输入输出,而在AT&T汇编中,我们的输入会自动转为字符串,这就给我们的运算带来困扰,如果能够让输入直接变成数字,或者我们把字符串转为数字,那样我们就可以进行基本运算了。接下来我们将讨论怎么将字符串转为数字。
因为在ASKII码中一个英文和数字占一个字节,所以我们只需要将每个位置的数取出,然后减去0的ASKII码值48就得到该位置的数,最后将他们组合成一个完整的数就可以了。
代码如下:
# 将123转为数字输出
.section .bss
.lcomm stack ,30
.section .data
temp:
.string "123"
.section .text
.globl _start
_start:
xorl %ebx,%ebx
movl $10, %ecx
xorl %eax,%eax #初始化ebx
movl $0,%edi #定位当前位置
loop:
movl temp(,%edi,1),%ebx #将该位置值传给eax
cmpl $0,%ebx
je exit #判断是否结束
#转为数字
mull %ecx
subl $48, %ebx #将ASKII转为数字
addl %ebx, %eax
incl %edi
jmp loop #继续
exit:
movl %eax, %ebx
movl $1, %eax
int $0x80
我们用edi定位当前取到的数的位置,循环一次增加1,而空的ASKII码值为0,所以我们只需要当取到的ASKII码值是0时,则退出循环。每次取出一个数转为数字后要乘上10,最后一个不用乘就可以了。
好了,我们编译链接一下
as --32 -o string_to_numbers.o string_to_numbers.s
ld -m elf_i386 -o string_to_numbers string_to_numbers.o
运行:
./string_to_numbers
echo $?
ok,成功了。好了,到这里也该结束了,对于怎样将数字转化为字符串可以到https://blog.csdn.net/qq_26943725/article/details/81044429网址进行观看,希望我的文章可以帮到您,同时也欢迎大家在下面发表问题,谢谢