我想使用bios中断0x10打印一个字符串。但我只得到一个蓝色的场,没有字母。也许我通过点击我的字符串来解决问题。
编辑:我有两个代码文件。第一个是写在软盘的第一个扇区上。它将第二个扇区从软盘复制到内存(从0x5000开始)并跳转到0x5000。这是我的第二个文件,我应该打印我的字符串。
[BITS 16]
org 0x5000
sect2:
mov ah, 0x03 ;get curser position
mov bh, 0x00 ;page number
int 0x10
mov ax, 0x0500
mov es, ax
mov bp, bsy1msg
mov ah, 0x13 ;write string
mov al, 0x01 ;update cursor after writing
mov bh, 0x00 ;page number
mov bl, 0x1F ;atributes
mov cx, bsy1len ;number of characters in string
int 0x10
end:
jmp end
bsy1msg db 13,10,"BSY1 via INT 0x10"
bsylen equ $ - bsy1msg
答案 0 :(得分:1)
org
指令不会导致程序在特定的物理地址加载,它会通知汇编程序假定程序已加载到代码段中。
例如,sect2
的值不为零,而是0x5000
。
将es
设置为0x500
会使其从物理地址05000
开始,但这不是程序所在的位置。您希望额外的段从与代码段相同的点开始,因为bsy1msg
标签是相对于代码段的(如果我正确计算的话,其值为0x501d
。)
push cs
pop es
答案 1 :(得分:1)
地址表示为segment:offset
,物理地址计算为segment*16+offset
。因此0x0500:0
指的是与0:0x5000
相同的物理地址。如果您的程序位于物理地址0x5000,则CS:IP
应为0x0500:0
或0:0x5000
。该字符串位于物理地址0x501d。由于您指定org 0x5000
nasm将假定bsy1msg的偏移量为0x501d。这意味着该段必须为0(0*16+0x501d = 0x501d
)。或者,如果将ES设置为0x0500(直接或通过复制CS),则需要省略组织0x5000或从BP(mov bp,bsy1msg-sect2
)中减去偏移量以获得正确的物理地址(0x0500*16+0x001d = 0x501d
)。