首页 > 编程语言 >C语言实现反汇编【微机原理】

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

时间:2022-11-16 12:08:09浏览次数:40  
标签:__ main rbp eax 微机 反汇编 ax C语言 bx


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语言实现反汇编【微机原理】_c语言


新建系统变量:LIBRARY_path

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


新建系统变量:C_INCLUDE_PATH

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

cmd测试

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语言实现反汇编【微机原理】_微机原理_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

}


标签:__,main,rbp,eax,微机,反汇编,ax,C语言,bx
From: https://blog.51cto.com/u_15719556/5855679

相关文章

  • 8086寄存器结构例题【微机原理】
    8086寄存器结构应用例题【微机原理】​​前言​​​​8086寄存器结构应用例题​​​​1、通用寄存器​​​​1)数据寄存器AX、BX、CX、DX​​​​ax应用例题​​​​bx应用......
  • C语言getchar和putchar是怎么实现的?
    所有的stdio库函数,比如包括getchar/putchar/getc/putc之类的,都会经过stdiobuffer:如果从最简单的实现来说,可以把FILE结构体定义成下面这样:typedefstruct_iobuf{......
  • c语言自定义输出小数点位数_c语言double类型默认输出小数几位
    C语言中常用的小数有两种类型,分别是float或double;float称为单精度浮点型,double称为双精度浮点型。不像整数,小数没有那么多幺蛾子,小数的长度是固定的,float始终占用4个......
  • C语言借助两个数的大小交换,引入指针。
    前期没有指针的时候,我们的交换只可以通过在被调函数中输出语句,来输出交换后的样子!被调函数的形参是局部变量,生命期仅仅在被调函数中有。因此,主函数中a,b仍然是......
  • 计算机等级考试二级C语言程序设计专项训练题——程序修改题(二)
    11、给定程序MODI1.C中规定输入的字符串全部为字母,fun函数的功能是:统计a所指字符串中每个字母在字符串中出现的次数(统计时不区分大小写),并将出现次数最高的字母输出(如果有多......
  • 计算机等级考试二级C语言程序设计专项训练题——程序修改题(一)
    1、下列给定程序中函数proc的功能是:取出长整型变量s中偶数位上的数,依次构成一个新数放在t中。例如,当s中的数为123456789时,t中的数为2468。请修改程序中的错误,使它能得出正......
  • c语言十六进制转为十进制
    #include<stdio.h>#include<string.h>intf(chararr[]){ intsum=0; for(inti=0;i<strlen(arr);i++){ if(arr[i]>='0'&&arr[i]<='9'){ arr[i]=arr[i]-'0';......
  • c语言基础认知1
    1)c语言的命名编程时给变量或者函数起的名字就是标识符。C语言的标识符是不可以随便起名字的,必须遵守一定的规则。C语言规定,标识符可以是字母(A~Z,a~z)、数字(0~9)、下划线_组......
  • C语言基础知识
    算法结构:一、顺序结构、选择结构、循环结构;二、循环结构又分为while型、until型、for循环结构;程序流程图;结构化程序设计方法:(1)自顶向下;(2)逐步细化;(3)模块化设计;(4)结构化编码......
  • 计算机等级考试二级C语言程序设计专项训练题——程序填空题(三)
    21、函数fun的功能是:不断从终端读入整数k,用变量a统计大于0的个数,用变量b来统计小于0的个数,当输入0时结束输入,并通过形参px和py把统计的数据传回主函数进行输出。注意:部分......