打印带有bios中断0x10的字符串

时间:2014-12-06 13:36:33

标签: assembly nasm bios

我想使用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

2 个答案:

答案 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:00: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)。