assembly - 如何用汇编语言打印字符串

标签 assembly nasm qemu

我正在尝试使用 NASM 在 Q Emulator 中打印一个字符串。我的代码如下:

mov bx,HELLO
mov ah, 0x0e
int 0x10
HELLO:
  db 'Hello', 0
jmp $
times 510-($-$$) db 0
dw 0xaa55

但是,当我编译这段代码时,我得到的输出是
UU

谁能告诉我为什么会这样?以及如何获取所需的字符串作为输出?

提前致谢。

最佳答案

好吧,这里是你问题的一个东西

为了加载字符串,您必须将其移动到 si (真的不想深入,而只是去做)。接下来为了将字符加载到寄存器 AL 中,使用 lodsb .接下来,我们必须打印它,所以使用 int 10h mov ah, 0Eh . Int 10h 处理视频,ah 告诉 BIOS 打印我们在 al(又名 lodsb)中拥有的任何内容。接下来,我们必须有一个结束加载字符,这样我们就不会永远循环。我个人使用 0x00 但是,您使用 0。0x00 在我的情况下要好得多,因为您不仅可以使用 0,而且 0x00 不打印任何内容,所以您为什么需要它?

好的,所以我们完成了所有工作,代码如下:

mov si, message ;消息位置*你可以改变这个*
call print ;CALL 告诉电脑完成后跳回这里

打印:
mov ah, 0Eh ;设置函数

。跑:
lodsb ;获取字符
; cmp al, 0x00 ;我会用这个,但你知道你不这么用:
cmp al, 0 ;0 的十六进制代码为 0x48 所以它不是 0x00
je .done ;如果找到结束代码则跳转到done
int 10h ;否则打印
jmp .run ;并跳回 .run

。完毕:
ret ;返回

message db 'Hello, world', 0 ;如果你使用 0x00
;消息数据库'你好,世界',0x00

关于assembly - 如何用汇编语言打印字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40143596/

相关文章:

C代码片段解释

assembly - 写入寄存器中存储的地址

c++ - 编译器在这里做什么,允许通过很少的实际比较来完成许多值的比较?

汇编代码的C实现

macos - 在 Mac OSX 上编译 NASM

linux - execvp 后 QEMU 无终端输出

linux - 需要 GUI 在 Ubuntu 服务器上运行 qemu

qemu - qemu-system-armw.exe 和 qemu-system-arm.exe 有什么区别?

assembly - 汇编中的call,push + ret和push + jump之间的区别

c - 将新部分插入二进制文件?