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只支持bxbp作为基址寄存器,sidi作为变址寄存器。您可以将两者都用于 [bx+si] 等模式,或省略其中一个以获得 [bx][si],但 dx 永远不能用于有效地址。由于16位实模式兼容8086,所以也有同样的限制。

有关 8086 寻址模式的完整概述,请参阅 https://www.ic.unicamp.br/~celio/mc404s2-03/addr_modes/intel_addr.html