【发布时间】:2013-07-15 08:51:28
【问题描述】:
我有一段代码在实模式下运行并在屏幕上打印一条消息,我使用 Dosbox 0.7 作为我的执行环境。下面是代码
jmp 0x7c0:start
start:
mov ax, cs ; set up segments
mov ds, ax
mov es, ax
mov al,03h
mov ah,0
int 10h
welcome db "This is insane now"
mov si, welcome
call print_string
print_string:
lodsb ; grab a byte from SI
or al, al ; logical or AL by itself
jz .done ; if the result is zero, get out
mov ah, 0x0E
int 0x10 ; otherwise, print out the character!
jmp print_string
.done:
ret
我可以很好地组装这段代码,但是当我运行它时,它只是挂在那里并且我可以在 linux 终端中看到一条消息
Illegal read from b0671921, CS:IP 7c0: 4468
这就是我的组装方式
nasm PRINT.ASM -o out.com
我已经尝试在谷歌中搜索此消息,发现它可能是 DOSBox 版本的问题。
谁能告诉我这里可能是什么问题?
【问题讨论】:
-
您是否正在尝试编写引导加载程序? COM 文件在地址 0x100 加载,因此您不能以这种方式运行引导加载程序。您必须创建一个虚拟软盘驱动器或硬盘驱动器,并将引导加载程序二进制文件放在第一个扇区中。此外,您的欢迎字符串缺少 NUL 终止符,不应该放在代码中间,因为 CPU 不知道代码和数据之间的区别。
-
如果您真的想创建一个 .COM 文件(而不是引导加载程序),您应该使用
[org 0x100]并删除开头的jmp(同时解决上述问题字符串变量)。 -
谢谢 Micheal,会试一试。