Intel x86 asm打印字符串功能



我试图写一个打印字符串函数;

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兼容,因此它具有相同的限制。

参见https://www.ic.unicamp.br/~celio/mc404s2-03/addr_modes/intel_addr.html获得8086寻址模式的完整概要。

最新更新