作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
语境:
在 64 位 linux 上学习 GAS 汇编。
许多教程是针对 32 位汇编的。
很难通过 x86_64 程序集进行丛林攻击。
题:
当我用gcc编译c程序时,我仍然看到一些%eax
和 movl
.
我主要玩int32_t
.
但我认为必须使用 x86_64
上的 64 位指令。 (如 rax
、 rbx
等)。
我不太明白。他们不应该是%rax
和 movq
?
在我的汇编程序中,我应该使用 movq
, 对 ?即使是 32 位整数?
我是一个迷失的初学者。
谢谢
最佳答案
您可以在 64 位模式下使用 32 位寄存器和指令,就像您也可以使用 16 或 8 位一样。要记住的一件事是,32 位指令会自动将相应 64 位寄存器的前 32 位归零,而 16 位或 8 位指令则不会:
movabsq $0xffffffffffffffff, %rax
movb $0, %al # rax = 0xffffffffffffff00
movw $0, %ax # rax = 0xffffffffffff0000
movl $0, %eax # rax = 0x0000000000000000
关于汇编 64 位 - movl、movq。换车好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28558249/
我是一名优秀的程序员,十分优秀!