[英]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.