任何人都可以帮助我了解这里到底发生了什么? 我是汇编语言的新手,编写了如下简单代码: (我在LINUX上开发)
我想要做的是接受用户的整数,只显示用户输入的内容。
.section .data
number:
.long 0
.section .text
.globl _start
_start:
movl $3, %eax #Read system call
movl $0, %ebx #file descriptor (STDIN)
movl $number, %ecx #the address to which data is to be read into.
movl $4, %edx #number of bytes to be read
int $0x80
#the entered number is stored in %ebx. it can be viewed using "echo $? "
movl number , %ebx
movl $1, %eax
int $0x80
但我没有得到预期的结果。相反,我正在为我输入的任何字符获取ASCII码。
代表:
input - 2
output - 50
input - 1
output - 49
input - a
output - 97 .... and so on?
有什么不对?我应该做出哪些改变才能获得理想的结果?什么是我错过理解的基本概念。
答案 0 :(得分:2)
输入在系统的本机代码页中完成。如果要将数字的ASCII码转换为相应的数字,则需要先做两件事:
Bounds检查一下。该值必须介于'0'和'9'之间,否则它不是数字。
减去'0'。这样'0'变为0,'5'变为5等等
答案 1 :(得分:1)
用C编写,然后使用编译器生成程序集。
然后修复程序集使其看起来像你写的那样。
答案 2 :(得分:0)
我已经找到了自己问题的答案。对于刚刚开始学习ASM并提出相同解释问题的其他人来说,这可能是有用的。
首先让我们看看代码中发生了什么:
.section .data
number:
.long 0
.section .text
.globl _start
_start:
movl $3, %eax #Read system call
movl $0, %ebx #file descriptor (STDIN)
movl $number, %ecx #the address to which data is to be read into.
movl $4, %edx #number of bytes to be read
int $0x80
到此为止发生的事情是:程序等待用户输入数字。 但是,实际读取的是“字节”的ASCII码。
Thus when a user enters '2' what actually is read is 0x32 or (110010 in binary or
its decimal equivalent is 50)
键盘驱动程序安排将这些位放在从输入读取内容时写入的特殊内存位置。 输入的真实情况与输出相同。当内存位置包含在屏幕上报告的二进制序列时,将应用类似的ASCII转换。
(目前仅考虑ASCII标准) 从而, INPUT ------> ASCII转换-------->转换数据(字节) 存储的字节--------> ASCII转换--------->输出数据
所以,现在问题出现了为什么这个程序的输出(实际上是%ebx的内容) 不像预期的那样......?
在我们的计划中,我们没有向屏幕显示任何内容。所有回声$?正在做的只是阅读ebx中的任何内容 - 即110010(50)。如果你想要echo $?要显示2,那么你必须将2(即00010)放入ebx。
回音$?程序将内存(ebx)的内容“解释”为整数,而不是字符。
这就是差异所在!
其他与“小端”英特尔架构有关的事情。 当你输入4523时,为什么输出为“52”而不是53,50等? 在小端架构中,当您输入数字4523时,将读取“4” 并存储在地址'number'中的最低有效字节
如果在big endian上编译/运行程序,可能会有不同的结果(反之亦然) 而最重要的是:当你“回音”? %ebx的最低有效字节 被解释。
That is why we get output 52 i.e '4'.
理解和解释这是一个棘手而难以理解的概念。你必须花一些时间思考这个问题。一旦你得到它,你会感觉很棒。
三江源。