代码之家  ›  专栏  ›  技术社区  ›  user2138149

Intel x86 asm打印字符串函数

  •  -1
  • user2138149  · 技术社区  · 4 年前

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

     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 。由于某种原因,从 dx 导致以下nasm错误:

    bootsector.asm:49: error: invalid effective address
    

    为什么不 mov al, [dx] 工作,但是 mov al, [si]

    1 回复  |  直到 4 年前
        1
  •  1
  •   Nate Eldredge    4 年前

    仅支持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寻址模式的完整概述。

    推荐文章