2012-03-26 49 views
0

你好,我是程序集新手,我努力讓兩部分程序工作。我爲這個x86程序集使用Visual Studio。x86程序集新手:基本添加和存儲數字問題

第一部分) 我的第一個目標是數到13,在每條路上增加每個值。 Ex,0 + 1 + 2 + 3 ... + 13 = 91。我想在總計中存儲該總數。

第2部分) 其次,我想從2^0到2^6的2次冪數。 Ex,0,1,2,4,8,32,64。 我認爲*我正在那樣做,但我並沒有隨着我去存儲每個價值。我想將它們存儲在連續的內存位置。

我有這個迄今爲止,

.586 
.MODEL FLAT 

.STACK 4096 

.DATA 
num1 BYTE 13   ;Initialize number to count to 
totall BYTE 0   ;Total of all counted numbers 
temp BYTE 0   ;Temp for loop adding 

shiftme BYTE 1  ;Start of counting 2^0 so I can reach 2^6 

.CODE 
main PROC 
;code here 

increment:   ;Increment label 
inc temp    ;Increment temp by 1 
mov eax, temp 
add totall, eax  ;Add temp+totall and store in totall 
cmp eax, num1   ;Compare for jump 
jne increment   ;Jump if not equal 

;this part should store each value 1,2,4,8,32.. in consecutive memory locat 
shiftallthethings: ;Shift label 
shl shiftme, 1  ;Shifting bits to the left one 
cmp shiftme, 64  ;Comparing for the jump 
jne shiftallthethings ;Jump if not equal to 

ret 
main ENDP 
END 

的問題,幫助我理解。

  • 如何將值存儲在連續的內存位置?
  • 我是否正確使用跳轉和標籤說明?
  • 我是否需要使用像eax這樣的特定寄存器來執行這些問題?爲什麼?

任何幫助非常感謝,謝謝。

+1

連續內存位置的存儲值是什麼意思?你能給我們解決一個具體的問題嗎?也被重新標記爲MASM32。 – 2012-03-26 19:19:35

+0

@MikeKwan我不完全確定這是什麼意思,如果我們忽略了這一點,我們每次在跳到標籤時都要存儲shiftme。此代碼是否有意義解決我發佈的問題? – KRB 2012-03-26 19:44:38

+0

'add totall,temp'和'cmp temp,num1'是錯誤的,因爲'add'和'cmp'不能在內存中同時存在兩個操作數。有效組合:寄存器+存儲器或存儲器+寄存器,寄存器+立即數常量,存儲器+立即數常量。你需要在這裏使用一個寄存器。 – 2012-03-26 19:56:26

回答

2

首先,在回答你的問題:

如何在連續的內存位置存儲值?

在MASM32,可以直接做movmov sum_addr, eax(只要數據類型具有相同的尺寸),也可以繞過數據指針。在我寫的例子中,一個指向total的指針被傳遞給函數。該函數然後將值寫入由該指針指向的存儲器(即total的內容)。不太確定連續內存位置的含義。如果你指的是指針算術,我也可以給你一個例子。

我是否正確使用跳轉和標籤說明?

是的,這似乎很好。我使用的替代方法是匿名標籤。當標籤微不足道並且相當接近時,這是適當的。這是個人喜好。如果您覺得標籤名稱更合適,請隨時使用。

我是否需要使用像eax這樣的特定寄存器來執行這些問題?爲什麼?

MASM32遵循Win32(stdcall)的調用約定,所以它也適合你。在寄存器保存方面,這意味着除了eax,ecxedx之外,所有功能都可以保留寄存器,這些寄存器被認爲是可以存儲的。如果需要多於4個字節,則返回值存儲在eaxeaxedx中。


在你寫的代碼方面,你有幾個問題,例如嘗試不同大小的數據類型的移動到對方。例如,如果將byte移動到dword,則必須先將其擴展爲相同大小。

mov eax, temp 

這不會編譯,因爲temp僅1個字節長,而eax爲4個字節。你可以改爲:

movzx eax, temp 

這個零擴展temp在做移動之前。這裏有一些代碼可以教你幾件事情。它使用宏(不知道你是否想學習這些),但另外演示慣用的MASM32參數傳遞和返回值。

include \masm32\include\masm32rt.inc 

.DATA 

total DWORD 0   ;Total of all counted numbers 

.CODE 

; takes in address of total and writes the value there 
sum PROC sum_addr:DWORD 

xor eax, eax 
xor ecx, ecx 

    @@: 
inc ecx 
add eax, ecx 
cmp ecx, 13 
jnz @b 

mov edx, sum_addr 
mov dword ptr ds:[edx], eax 
print ustr$(eax), 13, 10 

mov edx, sum_addr 
mov eax, dword ptr ds:[edx] 
ret 

sum ENDP 

start: 

push offset total   ; pass address of total 
call sum 
print ustr$(eax), 13, 10 ; demonstrating how to use return values 

print ustr$(total), 13, 10 ; testing result got stored properly 
ret 

end start 
END 

該代碼未優化,但應易於理解。請注意,我儘可能多地嘗試使用寄存器(如果我們有足夠的寄存器,這會比不斷處理內存更有效)。