C语言实现反汇编【微机原理】

  • ​​0.参考文章​​
  • ​​1.配置gcc (dev c++中MinGW64)​​
  • ​​2.反汇编​​
  • ​​3.debug简单分析​​
  • ​​4.在c代码里内联汇编​​

0.参考文章

​​gcc不是内部或外部命令,也不是可运行的程序或批处理文件​​使用 gcc 命令把C语言程序反汇编
如何在c代码里内联汇编
C语言汇编循环语句
GCC在C语言中内嵌汇编 asm
汇编语言 大小比较 理解 ja jna jg jle

​​一个C语言源程序是如何到一个可执行程序的​​

1.配置gcc (dev c++中MinGW64)

path系统变量

C语言实现反汇编【微机原理】_反汇编


新建系统变量:LIBRARY_path

C语言实现反汇编【微机原理】_反汇编_02


新建系统变量:C_INCLUDE_PATH

C语言实现反汇编【微机原理】_#include_03

cmd测试

C语言实现反汇编【微机原理】_c语言_04

2.反汇编

1.c

#include<stdio.h>
void main(){
int cx=10;
int ax=0;
int bx=1;
while(cx>0){
ax+=bx;
bx++;
cx--;
}
// printf("%d",ax);//55
}

C语言实现反汇编【微机原理】_微机原理_05

C语言实现反汇编【微机原理】_c语言_06

1_at.s

.file "1.c"
.def __main; .scl 2; .type 32; .endef
.text
.globl main
.def main; .scl 2; .type 32; .endef
.seh_proc main
main:
pushq %rbp
.seh_pushreg %rbp
movq %rsp, %rbp
.seh_setframe %rbp, 0
subq $48, %rsp
.seh_stackalloc 48
.seh_endprologue
call __main
movl $10, -4(%rbp)
movl $0, -8(%rbp)
movl $1, -12(%rbp)
jmp .L2
.L3:
movl -12(%rbp), %eax
addl %eax, -8(%rbp)
addl $1, -12(%rbp)
subl $1, -4(%rbp)
.L2:
cmpl $0, -4(%rbp)
jg .L3
addq $48, %rsp
popq %rbp
ret
.seh_endproc
.ident "GCC: (tdm64-1) 4.9.2"

会发现和debug中结果差不多

C语言实现反汇编【微机原理】_微机原理_07

3.debug简单分析

C语言实现反汇编【微机原理】_微机原理_08

4.在c代码里内联汇编

一个简单的内联例子

#include<stdio.h>

int a;
int main(){

printf("Test inline asm\n");
//__asm("mov $789,%eax");
//__asm("mov %eax,a");
__asm("mov $789,%eax\n""mov %eax,a\n");
printf("A is : %d\n",a);//789
return 0;
}

纯C语言

#include<stdio.h>
void main(){
int ax=0;
int bx=1;
int cx=10;

while(bx<=cx){
ax+=bx;
bx++;

}
printf("%d",ax);//55
printf("%d",bx);//11
}

对应C语言内联汇编

#include<stdio.h>
void main()
{
int ax=0,bx=1,cx=10;
__asm("mov ax,%eax\n");
__asm("mov bx,%ebx\n");
__asm("next:\n"
"cmp cx,%ebx\n "
"jg end\n"
"add %ebx,%eax\n"
"inc %ebx\n"
"jmp next\n"

"end:\n"
"mov %eax,ax"
"mov %ebx,bx"
);

printf("%d",ax);//55
printf("%d",bx);//11

}