【发布时间】:2016-08-20 15:39:44
【问题描述】:
我是汇编新手,我真的很困惑,我读了几篇文章和书籍,但我不明白这是什么意思
在汇编 x86 中,我们有不同的寄存器,每个寄存器都有特定的大小,例如
EAX : 32 位
Q1- 那么 32 位的真正含义是什么?这是否意味着,我只能存储 32 位大小的值?
如果是的话
Q2 - 如果我的字符串很长,我如何将这个字符串移动到我的寄存器中?
Q3 - 我想知道何时应该从堆栈中推送和弹出?
Q4 我可以在没有堆栈的情况下将我的值存储在我的寄存器中,为什么我们有一个堆栈?解决哪个问题?
如果我们在这里举个例子是我的 C 代码:
#include<stdio.h>
main()
{
printf("Hello World");
}
在这里,我们将 Hello world 传递给 printf 函数,无论大小我都可以传递任何东西,如果我将此代码转换为汇编,首先我必须将系统调用 args 移动到寄存器,然后调用系统调用然后是 int 0x80 。如果 instate of hello world 我有一个段落呢?
Q5 - 当我将任何数据移动到寄存器时,我如何选择应该将数据移动到哪个寄存器?
谢谢。
【问题讨论】:
-
阅读更多内容,您会明白的。您所问的大部分内容都是“无法回答的”,只是太混乱或基于不正确的前提而无法做任何事情。但是,是的,
eax确实总是 32 位。字符串通常通过其起始地址引用。 -
第一季度。是的。 第二季度。如果您更改它,请逐个更改,如果您传递它,则作为指针。 第三季度。当你需要它的时候。例如。你想使用一个必须在最后恢复的寄存器:推送它,使用它,弹出它。 第四季度。是的。我们需要存储 ubound 数量的项目,始终与最后一个交互。函数调用。段落字符 (?) 与“H”字符没有什么不同。 Q5 猜一猜,使用想到的第一个寄存器。随着您进一步开发代码,优化该选择以最小化您的目标指标(速度、溢出/填充、大小、复杂性)。
-
stackoverflow.com/questions/1773249/assembly-and-system-calls/… 的可能重复项:通过指针传递字符串。我知道在一个问题中问 5 件事很诱人,但它们甚至都不是相关的。例如Q5与其他无关。有关大量信息,请参阅x86 tag wiki。
-
我不同意“过于宽泛”的密切记录。这些都是非常明智的问题,只有高级语言经验的人在第一次看到汇编时经常会问这些问题,尤其是它通常在 Internet 资源中呈现的碎片化方式。我不会关闭这个问题。有一些简短的答案可以让新的汇编程序员克服困难并继续前进。 @JohnBurger 做得很好。
-
除了您确实需要写一本书来解决所有困惑之外,这里还有五个不同的问题。规则是每个问题一个问题。这是“太宽泛”的教科书案例(请原谅双关语)。