在Irvine32库中使用MASM打印数组 [英] Printing an array using MASM with Irvine32 library
本文介绍了在Irvine32库中使用MASM打印数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我的程序接受4个整数,并假定将它们显示给用户。在打印值时,我没有得到预期的结果。我正在将MASM与Kip的Irvine32 library
一起使用我的代码是:
include irvine32.inc
.data
msg byte "Enter a number",0
arr dword 4 dup(?)
len=($-arr)/4
.code
main PROC
mov edx,offset msg
call writestring
call crlf
mov eax,0
mov ecx,0
.while(ecx<len)
call readdec
mov arr[ecx],eax
inc ecx
.endw
mov ebx,0
mov ecx,0
.while(ecx<len)
mov ebx,arr[ecx]
call writedec
call crlf
inc ecx
.endw
exit
main ENDP
END main
我的程序运行示例:
Enter a number
1
2
3
4
4
4
4
4
在输入数字1、2、3和4之后,程序应该将这些数字显示回用户。我预期的输出为:
Enter a number
1
2
3
4
1
2
3
4
如果我修改打印数字的循环,以便将要打印的值放在EAX中,而不是EBX中,代码如下:
mov eax,arr[ecx]
call writedec
我最终得到了如下无意义的输出值:
Enter a number
1
2
3
4
67305985
262914
1027
4
我的程序为什么会这样,我如何修改它才能获得预期的结果?
推荐答案
代码中只有一个真正的问题出现在不同的位置。当您执行以下操作时:
.while(ecx<len)
call readdec
mov arr[ecx],eax
inc ecx
.endw
您必须认识到arr[ecx]
等同于arr+ecx
。ecx是添加到arr的偏移量(字节)。问题是arr的每个元素都是32位(4字节),因为您将数组声明为:
arr dword 4 dup(?)
您需要做的是将ecx乘以每个元素的长度(在本例中为4个字节)。您可以将ecx乘以数组中元素的大小arr[ecx*4]
=arr+(ecx*4)
。这种形式的scaled addressing仅支持在32位代码中乘以1、2、4和8的值。您的代码应该如下所示:
.while(ecx<len)
call readdec
mov arr[ecx*4],eax
inc ecx
.endw
调用Writedec的代码也存在类似的问题。同样,Writedec获取要在EAX中打印的数字,而不是EBX。此代码:
.while(ecx<len)
mov ebx,arr[ecx]
call writedec
call crlf
inc ecx
.endw
应该是这样的:
.while(ecx<len)
mov eax,arr[ecx*4]
call writedec
call crlf
inc ecx
.endw
在MASM中获取数组长度的另一个技巧是使用lengthof
伪操作码。您写到的地方:
len=($-arr)/4
您本可以使用:
len=lengthof arr
Lengthof将返回arr中的元素数。MASM考虑每个元素大小的大小(在本例中为4,因为您使用DWORD元素声明了arr)。你的做法没有错,我提供了另一种机制。
我强烈建议您学习使用调试器来单步执行您的代码。调试器可以是一个无价的工具,它允许您查看代码中的情况,并在任何给定时间查看寄存器和内存中的内容。这篇关于在Irvine32库中使用MASM打印数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文