在Irvine32库中使用MASM打印数组 [英] Printing an array using MASM with Irvine32 library

查看:0
本文介绍了在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+ecxecx是添加到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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆