GCC:putchar(char)inline assembly

溢出,

我怎么才能实现使用内联汇编的putchar(char)过程? 我想在x86-64程序集中做到这一点。 我这样做的原因是实现我自己的标准库(或至less它的一部分)。 这是我到目前为止:

void putchar(char c) { /* your code here: print character c on stdout */ asm(...); } void _start() { /* exit system call */ asm("mov $1,%rax;" "xor %rbx,%rbx;" "int $0x80" ); } 

我正在编译:

 gcc -nostdlib -o putchar putchar.c 

感谢您的帮助!

Solutions Collecting From Web of "GCC:putchar(char)inline assembly"

下面是GCC x86-64内联汇编中的一个例子my_putchar (在英特尔语法中,转换为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" ); } 

请注意, getchar(3) / putchar(3)是用于stdin / stdoutFILE结构中的复杂数据的宏(用于性能),具体处理缓冲等。 nrz的答案只是一个字符write(3)到文件描述符1,这是非常不同的。