Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为汇编程序翻译_C_Assembly_X86 - Fatal编程技术网

C 为汇编程序翻译

C 为汇编程序翻译,c,assembly,x86,C,Assembly,X86,我需要将方法中的注释翻译成汇编程序。我有一个大致的想法,但不能 有人能帮我吗?适用于英特尔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

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

有人能帮我吗?适用于英特尔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.
}
谢谢,

最后更新:

这是最终版本,正在运行并已发表评论,感谢所有人的帮助:)


为此,您可能会使用循环指令,在每个循环中递减ecx(通常称为扩展计数器),并在ecx为零时退出。但为什么要使用内联asm呢?我很确定像这样简单的东西会被编译器正确地优化


(我们说x86架构,因为它基于80x86计算机,但这是一个“ok”错误=p)

使用gcc生成汇编代码

gcc -S -c sample.c
男人是你的朋友

注意

for (init; cond; advance) {
    ...
}
本质上是语法上的糖

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

如果你在课堂上一直注意的话,这应该很容易翻译成汇编语言。

本质上讲,在汇编语言中,严格来说,循环的概念与在更高级的语言中没有相同的方式。它都是通过跳转实现的(例如作为“
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;
或:

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

    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:

这将更接近典型的
(int i=0;iI这是作业吗?如果是的话,不要指望有人会给你答案。展示你到目前为止所拥有的。你为什么需要这样做?编译器完全有能力为你做这件事。编译器的输出不够好有什么原因吗?让
gcc
为你做作业要比让网站帮你做作业快得多在程序设计问答中,尝试<代码> man GCC 。它是来自专业大会的自我作业……但我被踩坏了!为了那些不会说西班牙语的人,你会考虑把这些评论翻译成英文吗?我会自己做的,除非这不是一个有效的理由来让我编辑一个帖子,礼仪智慧:男人,GCC是你的朋友!五十、 一个生成汇编语言的编译器。谁会想到呢。哈哈,gcc的主页可能很有用,但请注意,gcc的主页是12838行!直到第678行,-s”选项才出现!@rascher必须阅读?消除想法!与正则表达式兼容的搜索?异端!;)谢谢,所以我可以使用注册表…递减和跳跃…嗯,现在我有一个shapeI同意…asveikau:这是一个很好的解释,现在我现在从哪里开始。非常感谢。Jejej谢谢…我开发软件有几年了…但现在是我开始自学PC架构、汇编程序和更多的时候。
    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:
    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: