首页 > 解决方案 > 汇编代码不能正确使用堆栈

问题描述

我正在练习组装,但遇到了问题。这是我的代码(程序集 8086):

org 100h

.model small
.stack 100h

.data
    arr db 2, 2, 3, 4, 5
    len equ $-arr
    sum db 0 
    
.code

jmp _start

Sum1 proc
    push bp
    mov bp, sp
    
    mov bx, [bp+6]    
    xor ax, ax         
    
    mov cx, len        
    cmp cx, 0          
    je _end
    
LoopSum:
    mov di, cx         
    add al, [bx+di-1]  
    loop LoopSum

_end:
    mov [bp+4], al     
    pop bp
    ret
Sum1 endp

_start proc
    mov ax, @data
    mov ds, ax
    
    push offset arr
    push offset sum
    call Sum1
    
    mov ax, 4c00h
    int 21h
    ret
_start endp
end

我的问题是变量sum(由 表示bp+4)的值错误(0 而不是预期的 10)。我错过了什么吗?ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ

标签: assemblyx86-16

解决方案


  1. 使用[bp+4](而不是[bp+8]

  2. 添加另一个寄存器,这样您就可以像这样访问它:([[bp+4]]但这实际上不是有效的语法;x86 在一种寻址模式下没有双重间接寻址。这就是为什么您需要另一个寄存器来加载指针的原因。)

    你应该把你的_end块改成这个:

_end: 
    mov si, [bp+4]
    mov [si], al     
    pop bp
    ret

推荐阅读