C语言求翻译成汇编 谢谢

abc123456789acb 2017-08-05 05:06:41




SAMPLE C CODE:
------------------------
int main( )
{
int value;
printf( "Provide a value: " );
scanf( "%d", &value );
int f = fibRec( value );
printf( "fib( %d ) = %d\n", value, f );
return( 0 );
}
int fibRec( int value )
{
int result = 1;
if (value == 1 || value == 2) // base case
result = 1;
else
result = fibRec( value-1 ) + fibRec( value-2 );
return( result );
}















我学的汇编 语法 是这样的 :

mov( 0, BX );
push( BX );

mov( 0, BX );
push( BX );
// not even multiple of 32-bits pushed onto sta+ck
// so I am pushing one last piece of junk
mov( 0, BX );
mov(0,ax);
push( BX );


...全文
1230 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
呃... 具体没测试,也有可能。
zara 2017-08-10
  • 打赏
  • 举报
回复
从 vc 里拷了个 listing.inc 过来,上面的那些汇编代码用 Masm32 可以通过编译啊
  • 打赏
  • 举报
回复
这编译器输出的汇编应该不能再汇编通过。
赵4老师 2017-08-07
  • 打赏
  • 举报
回复
支付宝zhao4zhong1@163.com
赵4老师 2017-08-07
  • 打赏
  • 举报
回复
#include <stdio.h>
int fibRec(int value) {
    int result = 1;
    if (value == 1 || value == 2) // base case
        result = 1;
    else
        result = fibRec( value-1 ) + fibRec( value-2 );
    return( result );
}
int main() {
    int value;
    printf( "Provide a value: " );
    scanf( "%d", &value );
    int f = fibRec( value );
    printf( "fib( %d ) = %d\n", value, f );
    return( 0 );
}
	TITLE	c:\tmp\tmp\err.cpp
	.386P
include listing.inc
if @Version gt 510
.model FLAT
else
_TEXT	SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT	ENDS
_DATA	SEGMENT DWORD USE32 PUBLIC 'DATA'
_DATA	ENDS
CONST	SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST	ENDS
_BSS	SEGMENT DWORD USE32 PUBLIC 'BSS'
_BSS	ENDS
$$SYMBOLS	SEGMENT BYTE USE32 'DEBSYM'
$$SYMBOLS	ENDS
$$TYPES	SEGMENT BYTE USE32 'DEBTYP'
$$TYPES	ENDS
_TLS	SEGMENT DWORD USE32 PUBLIC 'TLS'
_TLS	ENDS
;	COMDAT ??_C@_0BC@KGPP@Provide?5a?5value?3?5?$AA@
CONST	SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST	ENDS
;	COMDAT ??_C@_02MECO@?$CFd?$AA@
CONST	SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST	ENDS
;	COMDAT ??_C@_0BA@MKBB@fib?$CI?5?$CFd?5?$CJ?5?$DN?5?$CFd?6?$AA@
CONST	SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST	ENDS
;	COMDAT ?fibRec@@YAHH@Z
_TEXT	SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT	ENDS
;	COMDAT _main
_TEXT	SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT	ENDS
FLAT	GROUP _DATA, CONST, _BSS
	ASSUME	CS: FLAT, DS: FLAT, SS: FLAT
endif
PUBLIC	?fibRec@@YAHH@Z					; fibRec
;	COMDAT ?fibRec@@YAHH@Z
_TEXT	SEGMENT
_value$ = 8
_result$ = -4
?fibRec@@YAHH@Z PROC NEAR				; fibRec, COMDAT

; 2    : int fibRec(int value) {

	push	ebp
	mov	ebp, esp
	sub	esp, 68					; 00000044H
	push	ebx
	push	esi
	push	edi

; 3    :     int result = 1;

	mov	DWORD PTR _result$[ebp], 1

; 4    :     if (value == 1 || value == 2) // base case

	cmp	DWORD PTR _value$[ebp], 1
	je	SHORT $L584
	cmp	DWORD PTR _value$[ebp], 2
	jne	SHORT $L583
$L584:

; 5    :         result = 1;

	mov	DWORD PTR _result$[ebp], 1

; 6    :     else

	jmp	SHORT $L585
$L583:

; 7    :         result = fibRec( value-1 ) + fibRec( value-2 );

	mov	eax, DWORD PTR _value$[ebp]
	sub	eax, 1
	push	eax
	call	?fibRec@@YAHH@Z				; fibRec
	add	esp, 4
	mov	esi, eax
	mov	ecx, DWORD PTR _value$[ebp]
	sub	ecx, 2
	push	ecx
	call	?fibRec@@YAHH@Z				; fibRec
	add	esp, 4
	add	esi, eax
	mov	DWORD PTR _result$[ebp], esi
$L585:

; 8    :     return( result );

	mov	eax, DWORD PTR _result$[ebp]

; 9    : }

	pop	edi
	pop	esi
	pop	ebx
	mov	esp, ebp
	pop	ebp
	ret	0
?fibRec@@YAHH@Z ENDP					; fibRec
_TEXT	ENDS
PUBLIC	_main
PUBLIC	??_C@_0BC@KGPP@Provide?5a?5value?3?5?$AA@	; `string'
PUBLIC	??_C@_02MECO@?$CFd?$AA@				; `string'
PUBLIC	??_C@_0BA@MKBB@fib?$CI?5?$CFd?5?$CJ?5?$DN?5?$CFd?6?$AA@ ; `string'
EXTRN	__imp__printf:NEAR
EXTRN	__imp__scanf:NEAR
;	COMDAT ??_C@_0BC@KGPP@Provide?5a?5value?3?5?$AA@
; File c:\tmp\tmp\err.cpp
CONST	SEGMENT
??_C@_0BC@KGPP@Provide?5a?5value?3?5?$AA@ DB 'Provide a value: ', 00H ; `string'
CONST	ENDS
;	COMDAT ??_C@_02MECO@?$CFd?$AA@
CONST	SEGMENT
??_C@_02MECO@?$CFd?$AA@ DB '%d', 00H			; `string'
CONST	ENDS
;	COMDAT ??_C@_0BA@MKBB@fib?$CI?5?$CFd?5?$CJ?5?$DN?5?$CFd?6?$AA@
CONST	SEGMENT
??_C@_0BA@MKBB@fib?$CI?5?$CFd?5?$CJ?5?$DN?5?$CFd?6?$AA@ DB 'fib( %d ) = %'
	DB	'd', 0aH, 00H				; `string'
CONST	ENDS
;	COMDAT _main
_TEXT	SEGMENT
_value$ = -4
_f$ = -8
_main	PROC NEAR					; COMDAT

; 10   : int main() {

	push	ebp
	mov	ebp, esp
	sub	esp, 72					; 00000048H
	push	ebx
	push	esi
	push	edi

; 11   :     int value;
; 12   :     printf( "Provide a value: " );

	push	OFFSET FLAT:??_C@_0BC@KGPP@Provide?5a?5value?3?5?$AA@ ; `string'
	call	DWORD PTR __imp__printf
	add	esp, 4

; 13   :     scanf( "%d", &value );

	lea	eax, DWORD PTR _value$[ebp]
	push	eax
	push	OFFSET FLAT:??_C@_02MECO@?$CFd?$AA@	; `string'
	call	DWORD PTR __imp__scanf
	add	esp, 8

; 14   :     int f = fibRec( value );

	mov	ecx, DWORD PTR _value$[ebp]
	push	ecx
	call	?fibRec@@YAHH@Z				; fibRec
	add	esp, 4
	mov	DWORD PTR _f$[ebp], eax

; 15   :     printf( "fib( %d ) = %d\n", value, f );

	mov	edx, DWORD PTR _f$[ebp]
	push	edx
	mov	eax, DWORD PTR _value$[ebp]
	push	eax
	push	OFFSET FLAT:??_C@_0BA@MKBB@fib?$CI?5?$CFd?5?$CJ?5?$DN?5?$CFd?6?$AA@ ; `string'
	call	DWORD PTR __imp__printf
	add	esp, 12					; 0000000cH

; 16   :     return( 0 );

	xor	eax, eax

; 17   : }

	pop	edi
	pop	esi
	pop	ebx
	mov	esp, ebp
	pop	ebp
	ret	0
_main	ENDP
_TEXT	ENDS
END
赵4老师 2017-08-06
  • 打赏
  • 举报
回复
同意楼上 。
ckc 2017-08-06
  • 打赏
  • 举报
回复
编译的时候应该有参数可以直接编译出汇编代码来

21,453

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧