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

简介: 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
}
相关文章
|
6月前
|
C语言
【C语言】大小写字母的相互转化:多种方法解析及原理说明
【C语言】大小写字母的相互转化:多种方法解析及原理说明
454 0
|
6月前
|
存储 编译器 程序员
C语言之反汇编查看函数栈帧的创建与销毁(一)
C语言之反汇编查看函数栈帧的创建与销毁(一)
C语言之反汇编查看函数栈帧的创建与销毁(一)
|
6月前
|
C语言
C语言malloc与free实现原理
malloc()的实现很简单。它首先会扫描之前由 free()所释放的空闲内存块列表,以求找到尺寸大于或等于要求的一块空闲内存。(取决于具体实现,采用的扫描策略会有所不同。例如,first-fit 或 best-fito。)如果这一内存块的尺寸正好与要求相当,就把它直接返回给调用者。如果是一块较大的内存,那么将对其进行分割,在将一块大小相当的内存返回给调用者的同时,把较小的那块空闲内存块保留在空闲列表中。 如果在空闲内存列表中根本找不到足够大的空闲内存块,那么 malloc()会调用 sbrk()以分配更多
48 0
C语言malloc与free实现原理
|
1月前
|
自然语言处理 编译器 Linux
C语言中抽象的编译和链接原理
C语言中抽象的编译和链接原理
20 1
|
1月前
|
Linux C语言 iOS开发
MacOS环境-手写操作系统-06-在mac下通过交叉编译:C语言结合汇编
MacOS环境-手写操作系统-06-在mac下通过交叉编译:C语言结合汇编
19 0
|
3月前
|
存储 NoSQL Java
线程池的原理与C语言实现
【8月更文挑战第22天】线程池是一种多线程处理框架,通过复用预创建的线程来高效地处理大量短暂或临时任务,提升程序性能。它主要包括三部分:线程管理器、工作队列和线程。线程管理器负责创建与管理线程;工作队列存储待处理任务;线程则执行任务。当提交新任务时,线程管理器将其加入队列,并由空闲线程处理。使用线程池能减少线程创建与销毁的开销,提高响应速度,并能有效控制并发线程数量,避免资源竞争。这里还提供了一个简单的 C 语言实现示例。
|
3月前
|
Linux C# C语言
C 语言与嵌入汇编
C 语言与嵌入汇编
28 0
|
5月前
|
存储 算法 C语言
二分查找算法的概念、原理、效率以及使用C语言循环和数组的简单实现
二分查找算法的概念、原理、效率以及使用C语言循环和数组的简单实现
|
5月前
|
算法 搜索推荐 C语言
深入了解C语言的qsort函数:原理及相关知识
深入了解C语言的qsort函数:原理及相关知识
76 1
|
5月前
|
缓存 C语言
glibc函数malloc的工作原理
glibc函数malloc的工作原理
41 0