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