簡體   English   中英

使用帶有 Irvine32 庫的 MASM 打印數組

[英]Printing an array using MASM with Irvine32 library

我的程序接受 4 個整數,並假設將它們顯示回用戶。 打印值時,我沒有得到預期的結果。 我在 Kip 的Irvine32 庫中使用MASM

我的代碼是:

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)元素的大小來實現。 這種形式的縮放尋址僅支持乘以 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 )。 你這樣做的方式沒有錯,我提供了另一種機制。

我強烈建議學習使用調試器來單步調試你的代碼。 調試器可以是一個非常寶貴的工具,它可以讓您查看代碼中的進展情況,以及在任何給定時間查看寄存器和內存中的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM