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系统变量
新建系统变量:LIBRARY_path
新建系统变量:C_INCLUDE_PATH
cmd测试
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
}
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中结果差不多
3.debug简单分析
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
}