以下是GCC x86-64內聯彙編中的示例my_putchar
(在Intel語法中,轉換爲AT & T應該是微不足道的)。
與編譯:
gcc -ggdb -masm=intel -o gcc_asm_putchar gcc_asm_putchar.c
編輯:rdi
從破壞的寄存器失蹤。固定。
下面的代碼:
int main(void)
{
char my_char;
for (my_char = 'a'; my_char <= 'z'; my_char++)
my_putchar(my_char);
my_char = '\n';
my_putchar(my_char);
return 0;
}
void my_putchar(char my_char)
{
int dword_char;
dword_char = (int)my_char;
asm volatile(
".intel_syntax noprefix;"
"mov r10,rsp;" // save rsp.
"sub rsp,8;" // space for buffer, align by 8.
"mov [rsp],al;" // store the character into buffer.
"mov edi,1;" // STDOUT.
"mov rsi,rsp;" // pointer to buffer.
"mov edx,1;" // string length in bytes.
"mov eax,1;" // WRITE.
"syscall;" // clobbers rcx & r11.
"mov rsp,r10;" // restore rsp.
".att_syntax prefix;"
/* outputs */
:
/* inputs: eax */
: "a"(dword_char)
/* clobbered regs */
: "rcx", "rdx", "rsi", "rdi", "r10", "r11"
);
}
來源
2013-03-24 11:18:27
nrz
什麼操作系統/環境?你試過什麼了?你必須比這更精確。 – Mat 2013-03-24 09:02:11
感謝您的快速回復,它是x86-64上的Linux。我試圖用%eax,0x04調用中斷0x80。但我不知道如何在inline-assembly中訪問/轉發putchar(char)的函數參數。 – dubbaluga 2013-03-24 09:15:35
http://stackoverflow.com/questions/7048422/printing-range-of-ascii-characters-from-registers-in-x86-assembly – Mat 2013-03-24 09:17:23