[英](Homework) Translating a C recursive function to assembly (AT&T syntax)
[英]AT&T Assembly Syntax in C program (GCC compiler)?
如果我使用Windows x86上的GCC編譯器進行編譯,我有以下程序(AT&T匯編語法)可以完美運行:
LC0:
.ascii "Hello, world!\0"
.globl _main
_main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $16, %esp
call ___main
movl $LC0, (%esp)
call _puts
movl $0, %eax
leave
ret
這個簡單的程序可以在C程序中執行嗎? 我嘗試了以下方法:
#include <stdlib.h>
int main()
{
__asm__ ("LC0:\n\t"
".ascii 'Welcome Message\0'\n\t"
"LC1:\n\t"
".ascii 'Hello\0'\n\t"
"_main:\n\t"
"LFB11:\n\t"
"leal 4(%esp), %ecx\n\t"
"andl $-16, %esp\n\t"
"pushl -4(%ecx)\n\t"
"pushl %ebp\n\t"
"movl %esp, %ebp\n\t"
"pushl %ecx\n\t"
"subl $20, %esp\n\t"
"call ___main\n\t"
"movl $1, 12(%esp)\n\t"
"movl $LC0, 8(%esp)\n\t"
"movl $LC1, 4(%esp)\n\t"
"movl $0, (%esp)\n\t"
"call _MessageBoxA@16\n\t"
"subl $16, %esp\n\t"
"movl $0, %eax\n\t"
"movl -4(%ebp), %ecx\n\t"
"leave\n\t"
"leal -4(%ecx), %esp\n\t"
"ret\n\t");
return 0;
}
我收到一個錯誤:
錯誤:行尾有垃圾,第一個無法識別的字符為“ 8”
這工作正常:
__asm__(
"LC0:\n"
" .ascii \"Hello, world!\\0\"\n"
".globl _main\n"
"_main:\n"
" pushl %ebp\n"
" movl %esp, %ebp\n"
" andl $-16, %esp\n"
" subl $16, %esp\n"
" call ___main\n"
" movl $LC0, (%esp)\n"
" call _puts\n"
" movl $0, %eax\n"
" leave\n"
" ret\n"
);
只需C-string-literal-轉義雙引號字符串和其他位置的's/^/"/;s/$/\\\\n"/'
。
我的gcc匯編器不接受單引號字符串文字,如
LC0:
.ascii 'Hello, world!\0'
.globl _main
_main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $16, %esp
call ___main
movl $LC0, (%esp)
call _puts
movl $0, %eax
leave
ret
所以我不明白如果通過__asm__
提供它們,為什么它應該開始接受它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.