assembly - 无需系统调用即可打印字符

标签 assembly x86 nasm qemu osdev

我想知道如何在没有 int 0x80 和其他系统调用的情况下打印汇编中的字符。我正在为内核执行此操作。我有一个工作打印功能,但我想在汇编中编写一个,所以我更好地理解它实际上是如何工作的,而无需将所有内容编译为汇编。我正在使用QEMU。我是汇编新手,只能使用系统调用打印字符串。我正在使用 NASM 汇编器,我希望输出为 ELF32。这是我想要完成的任务的伪组装:

section .text
global _start
extern magic_print_function
_start:
      mov edx,1;length of buffer
      mov ecx,'c';character c to print
      ;somehow magically print the character without specifying stdout, maybe something like the VGA buffer?
      call magic_print_function

最佳答案

好吧,你说你不想要任何c。这有点困难,但我相信这是可能的。

首先,您需要将 ax 和 dx 设置为 0。然后从 0 开始堆栈。然后,您需要将视频内存加载到 ax 中。显存从0xb800开始。然后使es与ax的值相同。

将您的消息加载到变量中并将其放入 si 中。此时,调用一个将字符串写入视频内存的函数。该函数由多个较小的函数组成,这些函数分别写入字符并将光标向右移动一位。

一旦你有了编写字符串的代码,就用循环来挂起它。这非常简单:

loop:
    jmp loop

有关更多信息,请尝试此操作 http://wiki.osdev.org/Babystep4

关于assembly - 无需系统调用即可打印字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34071338/

相关文章:

assembly - 错误:“push”的无效指令后缀

java.lang.VerifyError : (class: Main, 方法:主签名:([Ljava/lang/String;)V) 堆栈大小太大

assembly - 在 32 位模式下,是否可以使用每条指令最多 3 个字节长调用相对地址?

linux - 如何启动这段代码?

performance - 依赖链分析

loops - 如果我在循环中使用 ECX(汇编),正确的循环方法是什么

assembly - 在程序集中将值设置为 null

c - _mm_stream_load_si128 (movntdqa) 是否修改其参数指向的内存?

nasm - 引导加载程序 - 加载第二阶段 - qemu 工作,真机不工作

c - 如何覆盖每个符号 NASM 中的 `--prefix` 选项?