利用下假期,打算把linux下的匯編語言給熟悉下,結果是以32位為版本的,只能在辦公室的機器上跑了個opensuse的32位版本,家里的suse掛了,無法輸入中文。打算再安裝下32位系統,今天找到了個解決方法,記錄如下:
代碼如下,文件名位test32.s:
1 .section .data 2 3 .section .text 4 5 .globl _start 6 _start: 7 pushl $2 8 pushl $1 9 call sumer 10 addl $8, %esp 11 movl %eax, %ebx 12 movl $1, %eax 13 int $0x80 14 15 .type sumer, @function 16 17 sumer: 18 pushl %ebp 19 movl %esp, %ebp 20 movl 8(%ebp), %eax 21 movl 12(%ebp), %ecx 22 addl %ecx, %eax 23 popl %ebp 24 ret
無法按照原來的方式,直接用as test32.s -o test32.o匯編
直接用ld test32.o -o test32鏈接
直接報錯,由於我的linux是64位,解決方法就是在兩個命令選項中加上適當的選項即可。
正確的命令是這樣的,直接用as test32.s -o test32.o --32 匯編
直接用ld -m elf_i386 test32.o -o test32鏈接
其中:-m參數是讓ld模仿后面跟的連接器,也就是elf_i386格式的連接器,
--32參數是使用32位個是的匯編進行代碼匯編,
如果有以下代碼test321.c
1 #include <stdio.h> 2 3 int factorial(int num){ 4 if(1 == num){ 5 return 1; 6 } 7 return num * factorial(num - 1); 8 } 9 10 int main(int argc, char **argv) 11 { 12 printf("factorial(5): %d\n", factorial(5)); 13 14 return 0; 15 }
在64位系統中,直接使用gcc test321.c -S test321.s,64位匯編代碼如下
1 .file "test321.c" 2 .text 3 .globl factorial 4 .type factorial, @function 5 factorial: 6 .LFB0: 7 .cfi_startproc 8 pushq %rbp 9 .cfi_def_cfa_offset 16 10 .cfi_offset 6, -16 11 movq %rsp, %rbp 12 .cfi_def_cfa_register 6 13 subq $16, %rsp 14 movl %edi, -4(%rbp) 15 cmpl $1, -4(%rbp) 16 jne .L2 17 movl $1, %eax 18 jmp .L3 19 .L2: 20 movl -4(%rbp), %eax 21 subl $1, %eax 22 movl %eax, %edi 23 call factorial 24 imull -4(%rbp), %eax 25 .L3: 26 leave 27 .cfi_def_cfa 7, 8 28 ret 29 .cfi_endproc 30 .LFE0: 31 .size factorial, .-factorial 32 .section .rodata 33 .LC0: 34 .string "factorial(5): %d\n" 35 .text 36 .globl main 37 .type main, @function 38 main: 39 .LFB1: 40 .cfi_startproc 41 pushq %rbp 42 .cfi_def_cfa_offset 16 43 .cfi_offset 6, -16 44 movq %rsp, %rbp 45 .cfi_def_cfa_register 6 46 subq $16, %rsp 47 movl %edi, -4(%rbp) 48 movq %rsi, -16(%rbp) 49 movl $5, %edi 50 call factorial 51 movl %eax, %esi 52 leaq .LC0(%rip), %rdi 53 movl $0, %eax 54 call printf@PLT 55 movl $0, %eax 56 leave 57 .cfi_def_cfa 7, 8 58 ret 59 .cfi_endproc 60 .LFE1: 61 .size main, .-main 62 .ident "GCC: (GNU) 9.1.0" 63 .section .note.GNU-stack,"",@progbits ~
在64位系統中,使用gcc test321.c -S -m32 test321.s,32位匯編代碼如下
1 .file "test321.c" 2 .text 3 .globl factorial 4 .type factorial, @function 5 factorial: 6 .LFB0: 7 .cfi_startproc 8 pushl %ebp 9 .cfi_def_cfa_offset 8 10 .cfi_offset 5, -8 11 movl %esp, %ebp 12 .cfi_def_cfa_register 5 13 subl $8, %esp 14 call __x86.get_pc_thunk.ax 15 addl $_GLOBAL_OFFSET_TABLE_, %eax 16 cmpl $1, 8(%ebp) 17 jne .L2 18 movl $1, %eax 19 jmp .L3 20 .L2: 21 movl 8(%ebp), %eax 22 subl $1, %eax 23 subl $12, %esp 24 pushl %eax 25 call factorial 26 addl $16, %esp 27 imull 8(%ebp), %eax 28 .L3: 29 leave 30 .cfi_restore 5 31 .cfi_def_cfa 4, 4 32 ret 33 .cfi_endproc 34 .LFE0: 35 .size factorial, .-factorial 36 .section .rodata 37 .LC0: 38 .string "factorial(5): %d\n" 39 .text 40 .globl main 41 .type main, @function 42 main: 43 .LFB1: 44 .cfi_startproc 45 leal 4(%esp), %ecx 46 .cfi_def_cfa 1, 0 47 andl $-16, %esp 48 pushl -4(%ecx) 49 pushl %ebp 50 .cfi_escape 0x10,0x5,0x2,0x75,0 51 movl %esp, %ebp 52 pushl %ebx 53 pushl %ecx 54 .cfi_escape 0xf,0x3,0x75,0x78,0x6 55 .cfi_escape 0x10,0x3,0x2,0x75,0x7c 56 call __x86.get_pc_thunk.bx 57 addl $_GLOBAL_OFFSET_TABLE_, %ebx 58 subl $12, %esp 59 pushl $5 60 call factorial 61 addl $16, %esp 62 subl $8, %esp 63 pushl %eax 64 leal .LC0@GOTOFF(%ebx), %eax 65 pushl %eax 66 call printf@PLT 67 addl $16, %esp 68 movl $0, %eax 69 leal -8(%ebp), %esp 70 popl %ecx 71 .cfi_restore 1 72 .cfi_def_cfa 1, 0 73 popl %ebx 74 .cfi_restore 3 75 popl %ebp 76 .cfi_restore 5 77 leal -4(%ecx), %esp 78 .cfi_def_cfa 4, 4 79 ret 80 .cfi_endproc 81 .LFE1: 82 .size main, .-main 83 .section .text.__x86.get_pc_thunk.ax,"axG",@progbits,__x86.get_pc_thunk.ax,comdat 84 .globl __x86.get_pc_thunk.ax 85 .hidden __x86.get_pc_thunk.ax 86 .type __x86.get_pc_thunk.ax, @function 87 __x86.get_pc_thunk.ax: 88 .LFB2: 89 .cfi_startproc 90 movl (%esp), %eax 91 ret 92 .cfi_endproc 93 .LFE2: 94 .section .text.__x86.get_pc_thunk.bx,"axG",@progbits,__x86.get_pc_thunk.bx,comdat 95 .globl __x86.get_pc_thunk.bx 96 .hidden __x86.get_pc_thunk.bx 97 .type __x86.get_pc_thunk.bx, @function 98 __x86.get_pc_thunk.bx: 99 .LFB3: 100 .cfi_startproc 101 movl (%esp), %ebx 102 ret 103 .cfi_endproc 104 .LFE3: 105 .ident "GCC: (GNU) 9.1.0" 106 .section .note.GNU-stack,"",@progbits
linux下命令的選項比命令更重要