gpt4 book ai didi

c - 将 FOR 翻译成汇编程序

转载 作者:行者123 更新时间:2023-12-02 05:24:26 25 4
gpt4 key购买 nike

我需要将方法中注释的内容翻译成汇编程序。我有一个大概的想法,但不能。

有人可以帮帮我吗?适用于 Intel x32 架构:

int 
secuencia ( int n, EXPRESION * * o )
{
int a, i;
//--- Translate from here ...
for ( i = 0; i < n; i++ ){
a = evaluarExpresion( *o );
o++;
}
return a ;
//--- ... until here.
}

翻译后的代码必须在 __asm 中:

__asm {
translated code
}

谢谢,

最终更新:

这是最终版本,正在运行并已评论,感谢大家的帮助:)

int
secuencia ( int n, EXPRESION * * o )
{
int a = 0, i;
__asm
{
mov dword ptr [i],0 ; int i = 0
jmp salto1
ciclo1:
mov eax,dword ptr [i]
add eax,1 ; increment in 1 the value of i
mov dword ptr [i],eax ; i++
salto1:
mov eax,dword ptr [i]
cmp eax,dword ptr [n] ; Compare i and n
jge final ; If is greater goes to 'final'
mov eax,dword ptr [o]
mov ecx,dword ptr [eax] ; Recover * o (its value)
push ecx ; Make push of * o (At the stack, its value)
call evaluarExpresion ; call evaluarExpresion( * o )
add esp,4 ; Recover memory from the stack (4KB corresponding to the * o pointer)
mov dword ptr [a],eax ; Save the result of evaluarExpresion as the value of a
mov eax,dword ptr [o] ; extract the pointer to o
add eax,4 ; increment the pointer by a factor of 4 (next of the actual pointed by *o)
mov dword ptr [o],eax ; o++
jmp ciclo1 ; repeat
final: ; for's final
mov eax,dword ptr [a] ; return a - it save the return value at the eax registry (by convention this is where the result must be stored)
}
}

最佳答案

从本质上讲,在汇编语言中,严格来说,不存在与高级语言中相同的循环概念。这一切都是通过跳转实现的(例如,作为“goto”...)

也就是说,x86 有一些指令假设您将编写“循环”,隐式使用寄存器 ECX作为循环计数器。

一些例子:

    mov ecx, 5         ; ecx = 5
.label:
; Loop body code goes here
; ECX will start out as 5, then 4, then 3, then 1...
loop .label ; if (--ecx) goto .label;

或者:

    jecxz .loop_end    ; if (!ecx) goto .loop_end;
.loop_start:
; Loop body goes here
loop .loop_start ; if (--ecx) goto .loop_start;
.loop_end:

而且,如果你不喜欢这个loop指令倒数……你可以这样写:

    xor ecx, ecx       ; ecx = 0
.loop_start:
cmp ecx, 5 ; do (ecx-5) discarding result, then set FLAGS
jz .loop_end ; if (ecx-5) was zero (eg. ecx == 5), jump to .loop_end
; Loop body goes here.
inc ecx ; ecx++
jmp .loop_start
.loop_end:

这将更接近典型的 for (int i=0; i<5; ++i) { }

关于c - 将 FOR 翻译成汇编程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1694630/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com