assembly popa和pusha实际上是如何工作的?

3phpmpom  于 2023-01-26  发布在  其他
关注(0)|答案(1)|浏览(226)

我试图从scrath编写一个简单的操作系统,但我遇到了一个问题,我编写了一个简单的过程,它运行一个字符串并将其打印在屏幕上。

print_string:
    pusha
    cmp byte[bx], 0    
    je exit             
    mov ah, 0x0e        
    mov al, [bx]        
    int 0x10            
    inc bx              
    jmp print_string    
    
    exit: 
        mov ah, 0x0e       
        mov al, 13          
        int 0x10            
        mov al, 10          
        int 0x10            
        popa
        ret

我会把它放在主文件里。

[org 0x7c00]              

mov bx, hello               
call print_string           
mov bx, hi                 
call print_string          
jmp $                       

%include "print_string.s"   
hello:                  
    db "Hello, World!",0     
hi:
    db "This is a test.",0

times 510-($-$$) db 0       
dw 0xaa55

但是由于某种原因,它没有打印Hello, World! This is a test.,而是只打印Hello World!
当我从print_string.s中删除pushapopa并将其放在主文件中时,如下所示:

[org 0x7c00]              

mov bx, hello    
 
pusha          
call print_string 
popa      
    
mov bx, hi   

pusha               
call print_string   
popa 
       
jmp $                       

%include "print_string.s"   
hello:                  
    db "Hello, World!",0     
hi:
    db "This is a test.",0

times 510-($-$$) db 0       
dw 0xaa55

很好用。怎么了?

jaql4c8m

jaql4c8m1#

在循环中调用print_string,每次迭代都执行pusha。但多个pusha只有一个popa指令。修复方法:

print_string:
    pusha
next_char:
    mov al, [bx]        
    or al, al
    je exit             
    mov ah, 0x0e        
    int 0x10            
    inc bx              
    jmp next_char

相关问题