10,11,13,18,21,23,24,17,45}中的一个或多个数组的值。
数组大小=数组列表大小/样本大小;
整数索引= 0; //while循环的索引
整数和= 0; //累加结果
数组大小=数组大小;当前大小〉0;当前大小--){
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的。我真的需要帮助,因为我不理解:(
1条答案
按热度按时间whitzsjs1#
for循环的基本模式等效如下:
C for循环
C while循环
程序集中的第一个循环遵循一些不同的基本形式:它已经相对于X1 M1 N1 X重新定位了X1 M0 N1 X部分。
当然,您可以通过与以下模式的比较来看出这一点:
<loop-body>
在每次迭代中看到的current_size
的值与C代码中的值不同(增量为1,此处为-1),因此,如果在<loop-body>
中查询该变量,它的运行方式将与C代码不同。在程序集中继续外部for的
test
条件没有反映C代码中的〉0。汇编代码中的%执行的是array[index%2],而C代码中的%执行的是array[index]%2,这显然是不同的概念,因此不会运行相同的代码(即使允许这样运行)。
当然,x86不能执行比较指令,因为存在双重内存引用。x86需要寄存器中一个操作数,以便另一个操作数成为内存操作数。
但是C代码甚至不需要两个数组引用,只需要一个,然后对它的值进行偶数测试。
C程式码需要if-then,但组件中遗漏了。
让我们转换下面的while-loop(它与for-loop结构相匹配):
转到程序集的if-goto-label样式: