如何打印单个 ASCII 字符?
Posted
技术标签:
【中文标题】如何打印单个 ASCII 字符?【英文标题】:How to print a single ASCII char? 【发布时间】: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
可以。
相关:***.com/questions/15596688/…(在 Linux x86-64 汇编中,您可以将其转换为 Linux x86 汇编)。
【参考方案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
)以上是关于如何打印单个 ASCII 字符?的主要内容,如果未能解决你的问题,请参考以下文章