使用 64 位 Linux 为 x86_64 编写汇编中的 putchar 吗?

2024-10-14 08:40:00
admin
原创
265
摘要:问题描述:我正在尝试使用 writesyscall来重现putchar打印单个字符的函数行为。我的代码如下,asm_putchar: push rbp mov rbp, rsp mov r8, rdi call: mov rax, 1 mov rd...

问题描述:

我正在尝试使用 writesyscall来重现putchar打印单个字符的函数行为。我的代码如下,

asm_putchar:
  push    rbp
  mov     rbp, rsp

  mov     r8, rdi

call:
  mov     rax, 1
  mov     rdi, 1
  mov     rsi, r8
  mov     rdx, 1
  syscall

return:
  mov     rsp, rbp
  pop     rbp
  ret

解决方案 1:

从中man 2 write,你可以看到签名是write

ssize_t write(int fd, const void *buf, size_t count);

它需要一个指向内存缓冲区的指针 ( const void *buf)。您不能通过char值传递它,因此您必须将其存储到内存中并传递一个指针。

write(除非只有一个字符需要打印,否则不要一次打印一个字符,这确实效率低下,这就是 C stdio 通常会缓冲 I/O 的原因。在内存中构造一个缓冲区并打印:例如这个 x86-64 Linux NASM 函数:如何在没有 c 库中的 printf 的情况下在汇编级编程中打印一个整数?(itoa,整数到十进制 ASCII 字符串))

GCC的 NASM 版本:内联汇编中的 putchar(char),对代码大小/效率进行了一些调整。

; x86-64 System V calling convention: input = byte in DIL
; clobbers: RDI, RSI, RDX,  RCX, R11 (last 2 by syscall itself)
; returns:  RAX = write return value: 1 for success, -1..-4095 for error
writechar:
    lea     rsi, [rsp-4]          ; RSI = buf in the red zone (below RSP)
    mov    [rsi], edi             ; store the char from RDI into it

    mov     eax, 1                ; __NR_write syscall number from unistd_64.h
    mov     edi, 1                ; EDI = fd=1 = stdout
    ; RSI = buf set earlier, before overwriting the char in EDI
    mov     edx, eax              ; RDX = len = 1  happens to be the same as fd and call #
    syscall                    ; rax = write(1, buf, 1)
    ret

我们实际上只需要 1 字节存储,例如mov [rsp-1], dil,但 4 字节存储可节省一个字节的代码大小。这int putchar(int)意味着调用者应该写入完整的寄存器,因此即使在旧 CPU 上我们也不会出现部分寄存器停顿。


如果您在 RSI 中传递了无效指针(例如'2'(integer 50)),则系统调用将在 RAX 中返回-EFAULT( -14)。(内核会将错误代码返回到系统调用中的错误指针,而不是像在用户空间中取消引用时那样传递 SIGSEGV)。

另请参阅汇编中系统调用的返回值是什么?

在玩具程序/实验中,您无需编写代码来检查返回值,而只需在 下运行它们即可strace ./a.out。如果您编写的程序_start不使用 libc,则在启动期间不会有任何其他您自己未执行的系统调用,因此读取输出非常容易,否则在您的代码之前会有一堆由 libc 执行的启动系统调用。strace 应该如何使用?

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2593  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1555  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。其中,技术评审与决策评审是IPD流程中至关重要的环节,它们既有明显的区别,又存在紧密的协同关系。深入理解这两者的区别与协同,对于企业有效实施IPD流程,提升产品开发效率与质量具有重要意义...
IPD管理流程   32  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、ClickUp、Freshdesk、GanttPRO、Planview、Smartsheet、Asana、Nifty、HubPlanner、Teamwork。在当今快速变化的商业环境中,项目管理软件已成为企业提升效率、优化资源分配和确保项目按时交付的关键工具。然而...
项目管理系统   28  
  建设工程项目质量关乎社会公众的生命财产安全,也影响着企业的声誉和可持续发展。高质量的建设工程不仅能为使用者提供舒适、安全的环境,还能提升城市形象,推动经济的健康发展。在实际的项目操作中,诸多因素会对工程质量产生影响,从规划设计到施工建设,再到后期的验收维护,每一个环节都至关重要。因此,探寻并运用有效的方法来提升建设工程...
工程项目管理制度   24  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用