int array_list[] = {10, 11, 13, 18, 21, 23, 24, 17, 45};
int array_size = sizeof array_list / sizeof 樣本;
整數索引 = 0;// while 回圈的索引
整數總和= 0;// 累加結果
`for (current_size = array_size ; current_size > 0 ; current_size--) {
while ( index < current_size)
{
if( array_list[index] is even )
{
sum = array_list[index];
}
index = 1;
}
}`
轉換后,將答案存盤在 sum 變數中
所以我必須將它轉換成 x86 匯編語言,這就是我到目前為止得到的
.386
.model flat, stdcall
.stack 4096
ExitProcess PROTO, dwExitCode: DWORD
.data
sum DWORD 0
array_list DWORD 10,11,13,18,21,23,24,17,45
array_size = ($ - array_list) / TYPE array_list
.code
main PROC
mov eax, 0 ; sum
mov esi, 0 ; index
mov ecx, array_size
L1:
dec ecx
cmp esi, ecx
jl L2
jmp L5
L2:
cmp esi, ecx
jl L3
jmp L4
L3:
cmp array_list[esi], array_list[esi%2]
add eax, array_list[esi]
jmp L4
L4:
add esi, 1
jmp L1
L5:
mov sum, eax
INVOKE ExitProcess, 0
main ENDP
END main
對于 array_size,我試圖確保它是 40/4 = 10 我不明白或不知道如何使用 for 回圈,所以第一個回圈一定是我在那里寫的錯誤。另外,如果它說 array_list[index] 是偶數,你是怎么做的。我還需要申報樣品嗎?因為它用于 array_size。我真的需要幫助,因為我不明白:(
uj5u.com熱心網友回復:
for 回圈的基本等價模式如下:
C for 回圈
for ( init; test; incr ) {
<loop-body>
}
C while 回圈
init;
while ( test ) {
<loop-body>
incr;
}
程式集中的第一個回圈遵循一些不同的基本形式:它重新定位了incr;與<loop-body>.
與以下模式相比,您肯定可以看到這一點:
init;
while ( test ) {
incr;
<loop-body>
}
每次迭代都會看到與 C 代碼<loop-body>不同的值(相差 1 個增量,此處為 -1),因此如果在.current_size<loop-body>
在程式集中繼續外部 for的test條件不會反映 C 代碼中的 > 0。
匯編代碼中的 % 正在執行陣列[index%2],而在 C 代碼中它正在執行陣列[index]%2,這是明顯不同的概念,因此不會運行相同的代碼(即使它被允許像那)。
當然,由于雙記憶體參考,x86 無法執行該比較指令。x86 需要暫存器中的一個運算元,以便另一個成為記憶體運算元。
但是那個 C 代碼甚至不需要兩個陣列參考。只是一個而不是對其價值的均勻測驗。
C 代碼需要一個 if-then,它在程式集中缺失。
讓我們轉換以下 while 回圈(與 for 回圈構造相匹配):
init;
while ( test ) {
<loop-body>
incr;
}
組裝的 if-goto-label 樣式:
init;
loop1:
if ( ! test ) goto endLoop1;
<loop-body>
incr;
goto loop1;
endLoop1:
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/537481.html
