assembly 如何将这个for()和while()循环转换为汇编

beq87vna  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(126)

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的。我真的需要帮助,因为我不理解:(

whitzsjs

whitzsjs1#

for循环的基本模式等效如下:
C for循环

for ( init; test; incr ) {
    <loop-body>
}

C while循环

init;
while ( test ) {
    <loop-body>
    incr;
}

程序集中的第一个循环遵循一些不同的基本形式:它已经相对于X1 M1 N1 X重新定位了X1 M0 N1 X部分。
当然,您可以通过与以下模式的比较来看出这一点:

init;
while ( test ) {
    incr;
    <loop-body>
}

<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结构相匹配):

init;
while ( test ) {
    <loop-body>
    incr;
}

转到程序集的if-goto-label样式:

init;
loop1:
    if ( ! test ) goto endLoop1;
    <loop-body>
    incr;
    goto loop1;
endLoop1:

相关问题