assembly 如何在汇编语言中打印字符串

3xiyfsfu  于 2023-02-12  发布在  其他
关注(0)|答案(2)|浏览(192)

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

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

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

UU

有谁能告诉我为什么会这样吗?以及如何得到所需的字符串作为输出?
先谢了。

tuwxkamq

tuwxkamq1#

好吧,这是你问题的一个小问题
为了加载字符串,必须将其移动到si中(我不想深入,但还是要做)。接下来为了加载一个字符到寄存器AL使用lodsb。接下来,我们必须打印它,所以使用int 10h mov ah,0Eh。Int 10h处理视频,ah告诉BIOS打印我们在al中的任何内容(aka lodsb)。接下来,我们必须有一个结束加载字符,这样我们就不会永远循环。我个人使用0x00,但是你使用0。0x00在我的情况下要好得多,因为你不仅可以使用0,0x00不打印任何东西,所以你为什么需要它呢?
好了,我们把所有的事情都做好了,下面是代码:

mov si, message       ;The message location *you can change this*
    call print            ;CALL tells the pc to jump back here when done

    print:
      mov ah, 0Eh         ;Set function

    .run:
      lodsb               ;Get the char
    ; cmp al, 0x00        ;I would use this but ya know u dont so use:
      cmp al, 0           ;0 has a HEX code of 0x48 so its not 0x00
      je .done            ;Jump to done if ending code is found
      int 10h             ;Else print
      jmp .run            ; and jump back to .run

    .done:
      ret                 ;Return

    message           db  'Hello, world', 0 ;IF you use 0x00
    ;message          db  'Hello, world', 0x00
ckx4rj1h

ckx4rj1h2#

我从here找到了这段代码,它对我很有效。使用nasm并编译为bin,然后使用.flp文件作为 Boot 信息并引导它。希望它对你也有效。

相关问题