相关疑难解决方法(0)

cltq在装配中做了什么?

0x0000000000400553 <main+59>:   mov    -0x4(%rbp),%eax
0x0000000000400556 <main+62>:   cltq   
0x0000000000400558 <main+64>:   shl    $0x3,%rax
0x000000000040055c <main+68>:   mov    %rax,%rdx
Run Code Online (Sandbox Code Playgroud)

事实上,我的程序很简单:

5   int main(int argc, char *argv[]) { 
6     int i = 0;
7     while(environ[i]) {
8       printf("%s\n", environ[i++]);
9     }
10    return 0;
Run Code Online (Sandbox Code Playgroud)

但是程序集输出很长:

Dump of assembler code for function main:
0x0000000000400518 <main+0>:    push   %rbp
0x0000000000400519 <main+1>:    mov    %rsp,%rbp
0x000000000040051c <main+4>:    sub    $0x20,%rsp
0x0000000000400520 <main+8>:    mov    %edi,-0x14(%rbp)
0x0000000000400523 <main+11>:   mov    %rsi,-0x20(%rbp)
0x0000000000400527 <main+15>:   movl   $0x0,-0x4(%rbp)
0x000000000040052e <main+22>:   jmp    0x400553 <main+59>
0x0000000000400530 <main+24>:   mov    -0x4(%rbp),%eax …
Run Code Online (Sandbox Code Playgroud)

x86 assembly gnu-assembler att

26
推荐指数
4
解决办法
4万
查看次数

程序集cltq和movslq的区别

计算机系统的第3章程序员的观点(第2版)提到了
cltq相当于movslq %eax, %rax.

为什么他们创建一个新的指令(cltq)而不是仅使用movslq %eax,%rax?这不是多余的吗?

x86 assembly x86-64 instruction-set att

7
推荐指数
1
解决办法
2万
查看次数

标签 统计

assembly ×2

att ×2

x86 ×2

gnu-assembler ×1

instruction-set ×1

x86-64 ×1