汇编语言 - 工作原理

时间:2014-10-03 23:25:37

标签: c assembly

我真的很擅长学习汇编语言,刚刚开始深入研究它,所以我想知道是否有些人可以帮我解决一个问题。我有一个家庭作业,告诉我将汇编语言指令与c代码进行比较,并告诉我哪个c代码等同于汇编指令。所以这是装配说明:

pushl %ebp // What i think is happening here is that we are creating more space for the function.
movl %esp,%ebp // Here i think we are moving the stack pointer to the old base pointer.
movl 8(%ebp),%edx // Here we are taking parameter int a and storing it in %edx
movl 12(%ebp),%eax // Here we are taking parameter int b and storing it in %eax
cmpl %eax,%edx // Here i think we are comparing int a and b ( b > a ) ?
jge .L3 // Jump to .L3 if b is greater than a - else continue the instructions
movl %edx,%eax // If the term is not met here it will return b
.L3:
movl %ebp,%esp // Starting to finish the function
popl %ebp // Putting the base pointer in the right place
ret // return

我试图根据我对此的理解来评论它 - 但我可能完全错了。 C函数的选项是:

int fun1(int a, int b)
{
unsigned ua = (unsigned) a;
if (ua < b)
return b;
else
return ua;
}
int fun2(int a, int b)
{
if (b < a)
return b;
else
return a;
}
int fun3(int a, int b)
{
if (a < b)
return a;
else
return b;
}

我认为正确答案很有趣..但我不太确定。

1 个答案:

答案 0 :(得分:6)

首先,欢迎来到StackOverflow。好地方,真的是。

现在首先,让我来帮助你;很多;很多。

你有很好的评论可以帮助你和我以及其他所有人,但是他们非常难看,阅读它们很痛苦。

以下是如何解决这个问题:空格,大量空白行,空白行,以及将指令分组为彼此相关的小组。

更重要的是,在条件跳转后,插入一个空白行,在绝对跳转后插入两个空行。 (旧技巧,非常适合可读性)

其次,排列评论,以便整齐排列。它看起来好一千倍。

这是你的东西,由我安排90秒的文字。相信我,专业人士会用这种源代码尊重你一千倍......

    pushl %ebp              //   What i think is happening here is that we are creating more space for the function.
    movl %esp,%ebp          //   Here i think we are moving the stack pointer to the old base pointer.

    movl 8(%ebp),%edx       //   Here we are taking parameter int a and storing it in %edx
    movl 12(%ebp),%eax      //   Here we are taking parameter int b and storing it in %eax


    cmpl %eax,%edx          //   Here i think we are comparing int a and b ( b > a ) ?
                            //   No, Think like this: "What is the value of edx with respect to the value of eax ?"

    jge .L3                 //   edx is greater, so return the value in eax as it is

    movl %edx,%eax          //   If the term is not met here it will return b
                            //   (pssst, I think you're wrong; think it through again)

    .L3:

    movl %ebp,%esp          //   Starting to finish the function
    popl %ebp               //   Putting the base pointer in the right place
    ret                     //   return

现在,回到你手头的问题。他所得到的是&#34;意识&#34;比较指令和相关的JGE指令。

这里有你需要理解的迷茫的东西,以便在这些类型的学术经历中生存下来&#34;

这个商业,cmpl %eax,%edx指令,是&#34; 比较&#34;的一种形式。说明

当您看到语法时尝试形成类似这样的想法,&#34; ... 目标操作数相对于源操作数的值是什么? ...& #34;

警告:我对AT&amp; T语法完全不了解,欢迎任何人在此纠正我。

无论如何,在这种特殊情况下,你可以像这样在脑海中表达这个想法......

&#34; ...我看到cmpl %eax,%edx所以我认为:关于eaxedx中的值是 ...& #34;

然后你用&#34; sense&#34;在你的脑海里完成那句话。下一条指令是条件跳转。

人脑中的范式过程可以形成这样的句子......

&#34; ... 关于eaxedx中的值大于或等于,所以我跳 ...&#34; < / p>

所以,如果你对ab的位置是正确的,那么你可以做范式的脑部加扰器并得到这样的东西......

&#34; ... 关于b中的值,a中的值大于或等于,所以我会跳 ...& #34;

要掌握这一点,请注意JGE是&#34;相反的意义&#34;如果愿意的话,JL(即#34;如果小于&#34则跳跃;)

好的,现在碰巧C中的return 汇编语言中的ret指令相关,但它并不是同一件事。< / p>

当C程序员说&#34; ... 该函数返回一个int ...&#34;他们的意思是......

  • 汇编语言子例程将在Eax
  • 中放置一个值
  • 然后子程序将修复堆栈并将其放回整齐的顺序
  • 子程序将执行其Ret指令

现在,还有一件混淆的项目被扔在你的脸上。

以下条件跳转适用于签名算术比较操作...

  • JG
  • JGE
  • JNG
  • JL
  • JLE
  • JNL

它就是!陷阱等着你搞砸了所有这些!

你想做签名或无符号比较???

顺便说一句,我从来没有见过任何人做过第一个函数的事情,其中​​无符号数与有符号数进行比较。这甚至合法吗?

所以无论如何,我们将所有这些事实放在一起,得到:如果a中的值小于b中的值,则此汇编语言例程返回b中的值,否则返回{{1}} 中的值。

这些值被评估为有符号整数。

(我认为我做对了;有人检查我的逻辑。我真的不喜欢汇编程序的语法。)

所以,无论如何,我有理由相信你不想让互联网上的人向你提供你特定家庭作业问题的具体答案,所以我会把它留给你来计算。它出自这个解释。

希望我已经解释了足够的逻辑和&#34;意识&#34;比较和签名和未签名的商业,以便你可以让你的大脑围绕这个。

哦,再次免责声明,我总是使用英特尔语法(例如,Masm,Tasm,Nasm等等),所以如果我在这里得到了一些东西,请随时为我纠正。