Intel x86 asm 打印字符串函数
Intel x86 asm print string function
我试图编写一个打印字符串函数;
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,所以也有同样的限制。
有关 8086 寻址模式的完整概述,请参阅 https://www.ic.unicamp.br/~celio/mc404s2-03/addr_modes/intel_addr.html。
我试图编写一个打印字符串函数;
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,所以也有同样的限制。
有关 8086 寻址模式的完整概述,请参阅 https://www.ic.unicamp.br/~celio/mc404s2-03/addr_modes/intel_addr.html。