assembly - 汇编代码不能正确使用堆栈
问题描述
我正在练习组装,但遇到了问题。这是我的代码(程序集 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)。我错过了什么吗?ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ
解决方案
使用
[bp+4]
(而不是[bp+8]
)添加另一个寄存器,这样您就可以像这样访问它:(
[[bp+4]]
但这实际上不是有效的语法;x86 在一种寻址模式下没有双重间接寻址。这就是为什么您需要另一个寄存器来加载指针的原因。)你应该把你的
_end
块改成这个:
_end:
mov si, [bp+4]
mov [si], al
pop bp
ret
推荐阅读
- amazon-s3 - 使用 Shrine 上传视频文件并生成缩略图
- visual-studio-code - 如何在 Windows 10 上的 VSCode 上启用具有子像素抗锯齿功能的 ClearType 渲染?
- javascript - 如何在运行下一个方法之前从数组中删除一个项目?
- ios - 在 iOS 版 Chrome 中下载 Apple Pass 时出错
- python - 从 numpy.timedelta64 转换为时间间隔
- rust - 有哪些选项可用于管理错误“无法借用 `*self` 作为可变/不可变”?
- vue.js - 如何修复:this.setDynamic 不是函数
- javascript - 如何使 onkeyup 仅成为字母键?
- ios - 将 JSON 数据与单元格一起使用
- graphql - 使用 apollo graphql 客户端记录请求时间的正确方法是什么?