当前位置: 首页 > 知识库问答 >
问题:

为什么我要添加rax和RDX?

南宫炜
2023-03-14
    null

现在我是否感到困惑:如果我想访问argv[1]中的第一个字符并将其存储在eax寄存器中,我希望汇编程序执行如下操作:

mov   eax, BYTE PTR [rdx]

如果我需要访问存储在ARGV[1]中的第二个字符并将其存储在eax寄存器中,我希望汇编程序执行如下操作:

mov   eax, BYTE PTR [rdx+1]

但相反,我看到编译器执行以下操作:

add     rax, rdx
    null
#include <string.h>
#include <stdio.h>

int main(int argc, char *argv[]) {
int sum = 0;
for(int i = 0; i < strlen(argv[1]); i ++){
  sum += (int)argv[1][i];
}
return 0;
}
mov     rax, QWORD PTR [rbp-48]
add     rax, 8
mov     rdx, QWORD PTR [rax]
mov     eax, DWORD PTR [rbp-24]
cdqe
add     rax, rdx
movzx   eax, BYTE PTR [rax]
movsx   eax, al
add     DWORD PTR [rbp-20], eax
add     DWORD PTR [rbp-24], 1

共有1个答案

扈瑞
2023-03-14

哦,我终于弄明白你的困惑了。在所讨论的指令点,rax不再包含ARGV;它被重新加载了i的值。编译器正在使用add指令而不是索引寻址模式

eax是RAX的低32位。当加载eax时,该值被零扩展到64位。

然后cdqesign-将EAX扩展为RAX,因为i是一个有符号的32位整数,用于索引指针。编译器本可以通过加载
MOVSX rax,dword ptr[rbp-24]来简化。

 类似资料:
  • 本文向大家介绍为什么eval要添加括号呢?相关面试题,主要包含被问及为什么eval要添加括号呢?时的应答技巧和注意事项,需要的朋友参考一下 没太理解题意,方法的调用是要加括号的啊…… 如果题目问的是为什么会有 这种调用形式的话,那是因为js规定在间接调用(无调用者上下文)时,其编译的代码会默认执行在顶层作用域。 例: 所以永远只会返回全局对象(该表达式可以作为的polyfill,并且无法被污染)

  • 今天我对封装感兴趣,对此我有一个基本问题。我理解为什么需要为私有字段添加setter和getter方法。但我看到为public int编写,字符串是其他的setter和getter。为什么我们需要为公共字段添加属性?我已经可以从任何地方访问公共变量。你怎么能用塞特和盖特控制我?谢谢

  • 我有一个通过Interface Builder定义的布局约束视图。由于它们无法暂时停用,我决定通过拨打以下电话有选择地删除它们: 但是,之后约束仍然驻留在视图中。约束。此外,我还希望以编程方式添加约束(同样,因为我无法(取消)激活它们): 对我的方法的任何调用都会导致变量wasAdded的值NO。这也反映在用户界面上,它根本没有改变。 最后,我既不能以编程方式添加约束,也不能删除添加到情节提要的约

  • 问题内容: 我正在使用jQuery SVG。我无法向对象添加或删除类。有人知道我的错误吗? SVG: 不会添加该类的jQuery: 我知道SVG和jQuery可以很好地协作,因为我 可以 定位对象并在单击对象时发出警报: 问题答案: 阅读以下两个答案。 jQuery 3修复了潜在的问题 Vanilla JS:可在现代浏览器中使用 jQuery(小于3)无法将类添加到SVG。 与SVG一起使用,因此

  • 问题内容: 请帮忙。将来自扫描仪的提示显示到控制台后,出现此错误: 问题是来自printf吗?我检查了格式,它看起来正确。 这是程序: 问题答案: 答:因为您的格式说明符与方法中使用的输入参数不匹配。 使用而不是将值用作格式说明符 另外需要额外的逃脱角色 最后,删除不必要的点字符 阅读:Formatter javadoc

  • 我也是Mockito和PowerMockito的新手。我发现我无法使用纯Mockito测试静态方法,因此我需要使用PowerMockito(对吗?)。 我有一个非常简单的类,名为Validate,使用这个非常简单的方法 因此,我需要验证: 1) 当我在null message参数上调用该静态方法时,将调用IllegalArgumentException。2)当我在null object参数上调用该