当前位置:  开发笔记 > 编程语言 > 正文

将FOR转换为汇编程序

如何解决《将FOR转换为汇编程序》经验,为你挑选了3个好方法。

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

有人可以帮我吗?适用于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)
    }
}

asveikau.. 8

基本上在汇编语言中,严格来说,循环的概念与高级语言中的概念不同.它都是通过跳跃实现的(例如,作为" 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) { }



1> asveikau..:

基本上在汇编语言中,严格来说,循环的概念与高级语言中的概念不同.它都是通过跳跃实现的(例如,作为" 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) { }



2> Artelius..:

注意

for (init; cond; advance) {
    ...
}

基本上是语法糖

init;
while(cond) {
   ...
   advance;
}

如果你在课堂上一直在关注,那么它应该很容易翻译成汇编语言.



3> 小智..:

使用gcc生成汇编代码

gcc -S -c sample.c

男人gcc是你的朋友


或者:男人,gcc是你的朋友!LOL,一种生成汇编语言的编译器.有谁会想过.
推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有