【问题标题】:How to print a single ASCII char?如何打印单个 ASCII 字符?
【发布时间】:2013-12-09 08:15:35
【问题描述】:

在 DOS 汇编中我们可以这样做:

mov dl, 41h
mov ah, 02h
int 21h

但是 Linux nasm x86 Assembly 怎么样?

【问题讨论】:

  • 使用sys_write 系统调用和fd == 1 (stdout) 和count == 1。你将如何去做取决于你是否在写作32 位或 64 位代码。有关 32 位示例,请参阅 this page
  • 不,我想打印一个 SINGLE 字符而不是字符串..
  • 然后让字符串由一个字符组成。
  • 在 Linux 中你不能做的是从寄存器打印单个字符 - 它必须在缓冲区中。 push 41h 可以。
  • 相关:stackoverflow.com/questions/15596688/…(在 Linux x86-64 汇编中,您可以将其转换为 Linux x86 汇编)。

标签: linux assembly x86 nasm


【解决方案1】:
section     .data

msg     db  'H'
len     equ $ - msg


section     .text
global      _start

_start:

mov     edx,len
mov     ecx,msg
mov     ebx,1    ;file descriptor (stdout)
mov     eax,4    ;system call number (sys_write)
int     0x80

mov     eax,1    ;system call number (sys_exit)
int     0x80

写入单个字符可能不会产生所需的输出,因为根据终端设置,它可能会被缓存,因此您可能需要刷新输出,以确保它出现在您写入的任何位置。

这是linux 32 Bit system calls的列表。

【讨论】:

  • sys_write 从不缓冲 I/O。我认为您正在谈论诸如printf 之类的C stdio 函数和写入缓冲区,但这就是库中的所有用户空间。 write() 永远不会“缓存”,只有在终端被阻塞时才会延迟(例如,通过 xon/xoff 流控制:^S^Q
猜你喜欢
  • 1970-01-01
  • 2016-12-25
  • 1970-01-01
  • 2010-12-14
  • 2012-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多