【问题标题】:How to convert this code into assembly language如何将这段代码转换成汇编语言
【发布时间】:2022-11-16 09:06:25
【问题描述】:

转换后,将答案存储在 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。我真的需要帮助,因为我不明白:(

【问题讨论】:

  • 请不要发布代码图片。 Edit你的问题并将代码替换为文本。然后我会收回我的反对票。
  • 我没有用图片发布我的代码

标签: for-loop assembly while-loop x86 masm


【解决方案1】:

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

C for 循环

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

C while 循环

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

程序集中的第一个循环遵循一些不同的基本形式:它相对于 &lt;loop-body&gt; 重新定位了 incr; 部分。

与以下模式相比,您肯定可以看到这一点:

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

&lt;loop-body&gt; 将在每次迭代中看到 current_size 的不同值(相差 1 个增量,此处为 -1)与 C 代码中的值不同,因此如果曾经咨询过该变量,它将不会与 C 代码运行相同的值在&lt;loop-body&gt;


在程序集中继续外部 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:

【讨论】:

  • 那么如何将 for 循环转换为程序集呢?比如我应该把减量放在哪里?对比之后呢?或者我把它完全放在最后?
  • 按照我展示的等效模式进行操作。有关详细信息,请参阅我的上次更新。
最近更新 更多