assembly - 如何在Assembly中打印数组

标签 assembly x86 calling-convention

我想打印结果数组,它有 3000 个元素。我写了这段代码:

.intel_syntax noprefix
.text
.globl main
main:
mov ecx, 3000
mov edx, offset result
llp:

mov al,[edx]
push eax
mov eax, offset message
push eax
call printf
add esp, 8
inc edx

loop llp
mov eax, 0
ret

.data
message : 
.asciz " Wynik: %i\n"

问题是,该程序仅打印第一个元素 3000 次。我应该改变什么?

更新

已解决

最佳答案

ecxedx 是调用者保存的寄存器,这意味着它们可以在 printf 等被调用函数中自由使用。您很幸运,甚至打印了 3000 件元素。一种可能的解决方案是使用调用 printf 周围的堆栈来保存和恢复这些寄存器:

llp:

mov al,[edx]
push ecx
push edx
push eax
mov eax, offset message
push eax
call printf
add esp, 8
pop edx
pop ecx
inc edx

loop llp

关于assembly - 如何在Assembly中打印数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34257617/

相关文章:

assembly - 如何根据 cmpss 输出(浮点比较)进行跳转?

assembly - 如何在nasm汇编语言中从Z循环回到A?

c - Hypervisor.framework 16位实模式

c# - stdcall 调用约定和在 C# 中使用 pinvoke

c++ - "cdecl"代表什么?

GCC ASM 优化问题还是隐形幽灵?

assembly - x86 程序集 - 编码相对 jmp

c++ - 读/写一个步长远大于其宽度的矩阵会导致性能损失很大

assembly - LEA 执行有符号或无符号算术吗?

assembly - 无堆栈函数的跳转/跳转编译策略。 (手动使用链接注册而不是调用/返回)