C 程序中的 AT&T 汇编语法(GCC 编译器)?
AT&T Assembly Syntax in C program (GCC compiler)?
我有以下程序(AT&T 程序集语法),如果我在 Windows x86 上用 GCC 编译器编译它,它可以独立运行:
LC0:
.ascii "Hello, world![=10=]"
.globl _main
_main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl , %esp
call ___main
movl $LC0, (%esp)
call _puts
movl [=10=], %eax
leave
ret
这个简单的程序可以用C程序执行吗?我尝试了以下内容:
#include <stdlib.h>
int main()
{
__asm__ ("LC0:\n\t"
".ascii 'Welcome Message[=11=]'\n\t"
"LC1:\n\t"
".ascii 'Hello[=11=]'\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 , %esp\n\t"
"call ___main\n\t"
"movl , 12(%esp)\n\t"
"movl $LC0, 8(%esp)\n\t"
"movl $LC1, 4(%esp)\n\t"
"movl [=11=], (%esp)\n\t"
"call _MessageBoxA@16\n\t"
"subl , %esp\n\t"
"movl [=11=], %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 , %esp\n"
" call ___main\n"
" movl $LC0, (%esp)\n"
" call _puts\n"
" movl [=10=], %eax\n"
" leave\n"
" ret\n"
);
简单的 C 字符串文字转义双引号字符串和 's/^/"/;s/$/\n"/'
其他地方。
我的 gcc 汇编器不接受单引号字符串文字,如
LC0:
.ascii 'Hello, world![=11=]'
.globl _main
_main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl , %esp
call ___main
movl $LC0, (%esp)
call _puts
movl [=11=], %eax
leave
ret
所以我不明白为什么如果您通过 __asm__
提供它们,它应该开始接受它们。
我有以下程序(AT&T 程序集语法),如果我在 Windows x86 上用 GCC 编译器编译它,它可以独立运行:
LC0:
.ascii "Hello, world![=10=]"
.globl _main
_main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl , %esp
call ___main
movl $LC0, (%esp)
call _puts
movl [=10=], %eax
leave
ret
这个简单的程序可以用C程序执行吗?我尝试了以下内容:
#include <stdlib.h>
int main()
{
__asm__ ("LC0:\n\t"
".ascii 'Welcome Message[=11=]'\n\t"
"LC1:\n\t"
".ascii 'Hello[=11=]'\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 , %esp\n\t"
"call ___main\n\t"
"movl , 12(%esp)\n\t"
"movl $LC0, 8(%esp)\n\t"
"movl $LC1, 4(%esp)\n\t"
"movl [=11=], (%esp)\n\t"
"call _MessageBoxA@16\n\t"
"subl , %esp\n\t"
"movl [=11=], %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 , %esp\n"
" call ___main\n"
" movl $LC0, (%esp)\n"
" call _puts\n"
" movl [=10=], %eax\n"
" leave\n"
" ret\n"
);
简单的 C 字符串文字转义双引号字符串和 's/^/"/;s/$/\n"/'
其他地方。
我的 gcc 汇编器不接受单引号字符串文字,如
LC0:
.ascii 'Hello, world![=11=]'
.globl _main
_main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl , %esp
call ___main
movl $LC0, (%esp)
call _puts
movl [=11=], %eax
leave
ret
所以我不明白为什么如果您通过 __asm__
提供它们,它应该开始接受它们。