我在nasm程序集中编写了以下代码,以便在scree上打印数组元素。在此代码中没有编译错误,但我在屏幕上得到了垃圾值。
section .data
num1: dd 10, 20, 30, 40, 50, 10, 20, 30, 40, 50,300
total: dd 0
msg : dd "Value=%d",10,0
section .text
extern _printf
global _main
_main:
push ebp
mov ebp,esp
mov ebx,num1 ;point bx to first number
mov ecx,11 ;load count of numbers in ecx
mov eax,0
loop:
mov eax,[ebx]
push msg
call _printf
add ebx,4
sub ecx,1
jnz loop
mov esp,ebp
pop ebp
ret
解
section .data
num1: dd 10, 20, 30, 40, 50, 10, 20, 30, 40, 50,300
total: dd 0
msg : dd "Value=%d",10,0
section .text
extern _printf
global _main
_main:
push ebp
mov ebp,esp
mov eax,10
mov ebx,num1 ;point bx to first number
mov ecx,0 ;load 0
loop:
;store the value because external function like printf modify the value
push ebx
push eax
push ecx
push DWORD [ebx]
push msg
call _printf
add esp,8
;restore thses values
pop ecx
pop eax
pop ebx
inc ecx
add ebx,4
cmp ecx,eax
jne loop
mov esp,ebp
pop ebp
ret
最佳答案
显然,您想将两个参数传递给printf。然后,您必须同时推送它们(您似乎认为其中之一是通过EAX传递的,但这不是事实)。
C函数对ECX来说是免费的,因此您应该保存和恢复它(现在不使用其他保存在调用方中的寄存器,但是现在该阅读有关X86调用约定的更多信息了)。
关于c - 用汇编语言打印数组元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14279119/