0

谁能帮我理解这里到底发生了什么?我是汇编语言的新手,写了一个简单的代码如下:(我在 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?

怎么了?我应该进行哪些更改才能获得预期的结果?我错过了理解的基本概念是什么。

4

3 回答 3

2

输入是在系统的本机代码页中完成的。如果要将数字的 ASCII 码转换为对应的数字,则需要先做两件事:

  1. 边界检查它。该值必须介于 '0' 和 '9' 之间,否则它不是数字。

  2. 减去“0”。这样'0'变成0,'5'变成5,等等。

于 2013-09-04T02:31:59.587 回答
2

用 C 语言编写它,然后使用您的编译器生成程序集。

然后修复程序集,使其看起来像您编写的那样。

于 2013-09-04T16:06:05.563 回答
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 CONVERSION--------> 转换的数据(字节) STORED BYTES-------->ASCII CONVERSION-- -------->输出数据

所以,现在问题出现了,为什么这个程序的输出(实际上是 %ebx 的内容)不像预期的那样......?

在我们的程序中,我们没有向屏幕显示任何内容。全部回声 $? 正在做的只是读取 ebx 中的任何内容——即 110010 (50)。如果你想回声$?要显示 2,则必须将 2(即 00010)放入 ebx。

回声 $? 程序将内存(ebx)的内容“解释”为整数,而不是字符。

这就是与众不同的原因!

其他与“小端”英特尔架构有关的事情。当您输入 4523 时,为什么我们得到输出为“52”而不是 53、50 等?....地址“号码”

如果你在大端编译/运行程序,你可能会得到不同的结果(反之亦然)最重要的是:当你“回显 $?” 解释 %ebx 的最低有效字节。

That is why we get output 52 i.e '4'.

这是一个棘手且难以理解和解释的概念。你必须花一些时间思考这个问题。一旦你得到它,你会感觉很棒。

谢谢你。

于 2013-09-11T07:25:54.663 回答