我的汇编函数打印一些字符串,但不打印其他字符串
My assembly function prints some strings, but not others
我正在开发一个简单的裸机 OS,我的打印字符串函数仅适用于某些字符串(例如“Hello World”),但不适用于其他字符串(例如“按 F1 寻求帮助”)
[ORG 0x7C00]
msg db "Press F1 for help",0
main:
mov AH, 00h
int 16h
cmp AH, 0x3B
je help
jmp main
help:
mov si, msg
call print
jmp main
; Print library, invoke with "call print" example:
; msg db "Foobar",0
; mov SI, msg
; call print
%include "printlib.inc"
return:
ret
times 510-($-$$) db 0;
db 0x55
db 0xAA
printlib.inc:
print:
mov ax, 0x07c0
mov ds, ax
cld
jmp .loop
.loop:lodsb
or al, al ; zero=end or str
jz .retn ; get out
mov ah, 0x0E
mov bh, 0
int 0x10
jmp .loop
.retn:
ret
BIOS 将始终在引导扇区的第一个字节开始执行,在您的情况下似乎是字符串,因此您正在执行数据。 (你放入一个名为 main
的标签这一事实不会影响这一点;没有人会看它。)可能是你的“Hello world”字符串恰好对应于不会完全破坏一切的指令.
尝试将字符串移动到所有代码之后,或者在它之前插入一个 jmp main
。
此外,您的 ORG
指令与 ds
段之间存在不一致。您的引导扇区被加载到线性地址 0x7c00
。您可以将 segment:offset 形式视为 0000:7c00
或 07c0:0000
(或者如果您确实需要,也可以采用介于两者之间的其他方式)。因此,要访问引导扇区中的数据,您需要使用零加载 ds
并使用 [ORG 0x7c00]
,或者使用 0x07c0
加载 ds
并使用 [ORG 0]
.但是,您的代码混合了两者。
我正在开发一个简单的裸机 OS,我的打印字符串函数仅适用于某些字符串(例如“Hello World”),但不适用于其他字符串(例如“按 F1 寻求帮助”)
[ORG 0x7C00]
msg db "Press F1 for help",0
main:
mov AH, 00h
int 16h
cmp AH, 0x3B
je help
jmp main
help:
mov si, msg
call print
jmp main
; Print library, invoke with "call print" example:
; msg db "Foobar",0
; mov SI, msg
; call print
%include "printlib.inc"
return:
ret
times 510-($-$$) db 0;
db 0x55
db 0xAA
printlib.inc:
print:
mov ax, 0x07c0
mov ds, ax
cld
jmp .loop
.loop:lodsb
or al, al ; zero=end or str
jz .retn ; get out
mov ah, 0x0E
mov bh, 0
int 0x10
jmp .loop
.retn:
ret
BIOS 将始终在引导扇区的第一个字节开始执行,在您的情况下似乎是字符串,因此您正在执行数据。 (你放入一个名为 main
的标签这一事实不会影响这一点;没有人会看它。)可能是你的“Hello world”字符串恰好对应于不会完全破坏一切的指令.
尝试将字符串移动到所有代码之后,或者在它之前插入一个 jmp main
。
此外,您的 ORG
指令与 ds
段之间存在不一致。您的引导扇区被加载到线性地址 0x7c00
。您可以将 segment:offset 形式视为 0000:7c00
或 07c0:0000
(或者如果您确实需要,也可以采用介于两者之间的其他方式)。因此,要访问引导扇区中的数据,您需要使用零加载 ds
并使用 [ORG 0x7c00]
,或者使用 0x07c0
加载 ds
并使用 [ORG 0]
.但是,您的代码混合了两者。