我试图写一个打印字符串函数;
45 ; the address is stored in si
46 print_string:
47 pusha
48 ; load character from si
49 mov al, [si]
50 cmp al, 0x00
51 jz print_string_end
52 call print_char ; print the char using the print_char function
53 inc si ; increment the string printing index si
54 print_string_end:
55 popa
56 ret
57
58 ; print function: print a single character
59 ; the character is stored in al
60 print_char:
61 pusha
62 mov ah, 0x0e
63 int 0x16
64 popa ; don't know what registers int 0x16 modifies
65 ret
66
67 mystring:
68 db "loading operating system",0x00
组装并运行。然而,在我改为使用si
来打印当前字符的地址之前,我使用的是寄存器dx
。由于某些原因,从si
更改为dx
会导致以下nasm错误:
bootsector.asm:49: error: invalid effective address
为什么mov al, [dx]
不行,而mov al, [si]
可以?
16位8086只支持bx
和bp
作为基寄存器,si
和di
作为索引寄存器。您可以在[bx+si]
等模式中同时使用这两种模式,或者省略一个模式以获得[bx]
或[si]
,但是dx
在有效地址中永远不可用。由于16位实模式与8086兼容,因此它具有相同的限制。
参见https://www.ic.unicamp.br/~celio/mc404s2-03/addr_modes/intel_addr.html获得8086寻址模式的完整概要。