【发布时间】:2015-07-26 08:40:04
【问题描述】:
简单地说, 我有以下代码:
#include <stdio.h>
#define MAXNO 100
void selectionSort(int [], int);
int main() // main.c
{
int no = 0, i ;
int data[MAXNO] ;
printf("Enter the data, terminate with Ctrl+D\n") ;
while(scanf("%d", &data[no]) != EOF) ++no;
selectionSort(data, no) ;
printf("Data in sorted Order are: ") ;
for(i = 0; i < no; ++i) printf("%d ", data[i]);
putchar('\n') ;
return 0 ;
}
我在运行时生成了以下汇编代码
cc -S -Wall main.c
.file "main.c"
.section .rodata
.align 8
.LC0:
.string "Enter the data, terminate with Ctrl+D"
.LC1:
.string "%d"
.LC2:
.string "Data in sorted Order are: "
.LC3:
.string "%d "
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $416, %rsp
movl $0, -408(%rbp)
movl $.LC0, %edi
call puts
jmp .L2
.L3:
addl $1, -408(%rbp)
.L2:
leaq -400(%rbp), %rax
movl -408(%rbp), %edx
movslq %edx, %rdx
salq $2, %rdx
addq %rdx, %rax
movq %rax, %rsi
movl $.LC1, %edi
movl $0, %eax
call __isoc99_scanf
cmpl $-1, %eax
jne .L3
movl -408(%rbp), %edx
leaq -400(%rbp), %rax
movl %edx, %esi
movq %rax, %rdi
call selectionSort
movl $.LC2, %edi
movl $0, %eax
call printf
movl $0, -404(%rbp)
jmp .L4
.L5:
movl -404(%rbp), %eax
cltq
movl -400(%rbp,%rax,4), %eax
movl %eax, %esi
movl $.LC3, %edi
movl $0, %eax
call printf
addl $1, -404(%rbp)
.L4:
movl -404(%rbp), %eax
cmpl -408(%rbp), %eax
jl .L5
movl $10, %edi
call putchar
movl $0, %eax
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4"
.section .note.GNU-stack,"",@progbits
我不明白的是:
四元运算和长运算(如movq 和movl)之间有什么区别。我知道一个用于 64 位,另一个用于 32 位操作,但这里的整数被视为 32 位,对吗?那么为什么在代码中混合了movqs 和movls(或任何其他操作)?
编辑:
忘记添加我的系统的详细信息:
Linux Z510 3.13.0-58-generic #97-Ubuntu SMP Wed Jul 8 02:56:15 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
【问题讨论】:
-
存在混合,因为某些操作需要是 64 位的,例如对指针的操作。编译器将根据情况使用正确的操作数大小。
标签: assembly x86-64 gnu-assembler att