汇编语言转为c语言main,汇编转换成c语言

本文目录一览:

汇编语言与C语言转换

程序有很多问题,做了部分修改

#includereg51.h

#define uchar unsigned char

sbit p10=P1^0;

sbit p30=P3^0;

sbit p31=P3^1;

sbit p12=P1^2;

void delay()

{

uchar i,j;

for(i=0;i170;i++)

for(i=0;i187;i++);

}

void alarm()

{

uchar times;

p12=1;

p30=0;

p31=0;

times=0x14;

TMOD=0x01;

TH0=0x3c;

TL0=0xb0;

TR=1;

while(times)

{

while(TF0==0);

TF0=0;

TH0=0x3c;

TL0=0xb0;

times–;

}

p30=1;

p31=0;

p12=0;

}

void pint0() interrupt 0

{

EX0=0;

if(p32==0)

{

delay();

if(p32==0)

{

p30=1;

p31=0;

p12=0;

}

}

EX0=1;

}

main()

{

IE=0x81;

IT0=1;

SP=0x30;

p30=1;

p31=1;

P1=0xff;

P2=0x00;

p12=0;

while(1)

{

if(p10==0)

{

delay();

if(p10==0)alarm();

}

}

}

单片机C51,将汇编语言转换为C语言

#includereg52.h

#define u8 unsigned char

#define u16 unsigned int

#define BufSize 0x10

u8 buf[BufSize];

u8 js=0;

void main(){

SCON=0x80;

PCON=0x80;

EA=1;

ES=1;

ACC=buf[0];

TB8=P;

SBUF=ACC;

while(1);

}

void TRANI()interrupt 4

{

TI=0;

js++;

if(js==BufSize){

ES=0;

}

else{

ACC=buf[js];

TB8=P;

SBUF=ACC;

}

}

顺便优化汇编代码

        BUF  EQU 0X50

ORG 0000H

JMP MAIN

ORG 0023H

JMP TRANI

MAIN:

MOV SCON,#0X80;

MOV PCON,#0X80

SETB EA

SETB ES

MOV R0,#BUF

MOV A,@R0

MOV C,P

MOV TB8,C

MOV SBUF,A

JMP $

TRANI:

PUSH PSW

PUSH ACC

INC R0

CJNE R0,#BUF+0x10,NEXT

JMP TEND

NEXT: MOV A,@R0

MOV C,P

MOV TB8,C

MOV SBUF,A

TEND:

POP ACC

POP PSW

RETI

如何将这段汇编语言转换成C语言

如何将这段汇编语言转换成C语言?题目分别提供了同一C语言代码的32位和64位汇编版本:很容易可以得出其源C语言代码:

int f(int** p){

return (**p=**p+4,*(int*)**p);

}

则函数体的返回值类型是int,参数p的类型是int**,其唯一的语句是return (**p=**p+4,*(int*)**p);

先把结论放在这,节约不想思考的同学的时间,不同编译器可能会有所不同,lea 0x4(%eax),%ecx指令可能会被编译器拆开成两段:mov (%eax),%ecx 和add 0x4,%ecx(对于64位,则是编译器把lea lea 0x4(%rax),%rcx,拆开成mov (%rax),%rcx 和add 0x4,%rcx,但是效果是一样的。

根据题目中函数体只有1句代码的信息,我们至少确定了这个代码是一个return语句,如此短小的函数当然只需要用到段内跳转和段内指针,不需要段地址信息,所以指针大小(64位的RIP和32位的EIP)只是偏移量大小,分别为64位(8字节)和32位(4字节)。

题目的设问有相当好的引导性,对比查看左边和右边的倒数第3个指令,我们可以看出:函数的返回值都是放在eax变量之中,说明返回值的类型大小是4个字节。而同时,我们知道在C语言中,64位和32位环境下,int类型的大小都是4个字节,所以第1空的答案不能是只有1字节的char类型,也不能是在32位环境下大小为4字节而在64位环境下大小为8字节的指针类型如char*、int*。综上,第1空的答案:函数f的返回值类型只能是int。

第2空则是考查C语言函数的参数传递,栈式参数传递,在call函数f把ip压入(分别为64位的RIP和32位的EIP)之前,先压入的是函数的实际参数,其类型暂时不知道,那就得从汇编指令中找出这个信息点:

C语言函数体标志就是:push %ebp→mov %esp,%ebp→函数体内部→pop %ebp→ret(对64位则是:push %rbp→mov %rsp,%rbp→函数体内部→pop %rbp→retq)

两边都是同一个简单的c语句得到的汇编语句(64位和32位),左边64位的第2、3、4行对应于右边的第2、3行(64位多用了一个rdi寄存器传递参数,可能是编译器选项不同的缘故,又因为main函数中调用函数f的指令没有给出,且不一定相同,故不影响判断)。

两边剩下的几行代码(左边2、3、4、5、6、7、8行,右边2、3、4、5、6、7行)的工作大同小异,从数据流上看(函数体内,对于32位0x8(%ebp)是第一个也是唯一一个参数,对于64位-0x8(%rbp)才是):

*p→eax,*eax→eax,eax+4→ecx(①),*p→edx,ecx→*edx,*eax→eax

可以简化为:

**p→eax,eax+4→ecx,ecx→**p,***p→eax

再简化为

**p+4→**p,***p→eax

注:(①)lea 0x4(%eax), %ecx 意思是取有效地址Load Effect Address,相比于mov 0x4(%eax), %ecx使用地址所指向的值*(eax+4)→ecx,lea指令只使用地址的值eax+4→ecx,少做一步。64位也是如此a。

(对于64位则是:

*p→rax,*rax→rax,rax+4→rcx,*p→rdx,rcx→*rdx,*rax→eax

可以简化为:

**p→rax,rax+4→rcx,rcx→**p,***p→eax

再简化为

**p+4→**p,***p→eax

看到数据流了,C语言语句自然也就呼之欲出了,即return (**p=**p+4,*(int*)**p)。(逗号,运算符的意思是从左到右计算式子,然后返回最后一个)

注意这里的+4指的是4个字节,而在64位32位中都一样,于是初步断定**p是固定大小类型变量,同时返回值是int类型的,故认为它(**p)是int,所以参数p的类型就是int**。

请问如何把汇编语言转成C语言

反过来是可以的,叫反汇编,但汇编无法转C,因为汇编是机器语言,C最终还是转化成汇编,想转的话只能人为的编一个C出来

怎么把汇编转换成C语言

如果 只是简单的几行,可以把编译后的exe文件,用系统自带的debug(windows键+R打开 运行窗口 输入debug 空格 exe的路径)打开debug后,输入U可以看到几行汇编代码。

如果是源代码 在vs编译器中调试运行,菜单上的:调试–窗口–反汇编 可以查看,如果是其他编译器 仔细找找也带反汇编的

要资料的话 [天书夜读-从汇编语言到Windows内核编程].谭文.邵坚磊. 这本书的基础部分里 有c语言与汇编的转换

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/248427.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝的头像小蓝
上一篇 2024-12-12 13:26
下一篇 2024-12-12 13:26

相关推荐

  • AES加密解密算法的C语言实现

    AES(Advanced Encryption Standard)是一种对称加密算法,可用于对数据进行加密和解密。在本篇文章中,我们将介绍C语言中如何实现AES算法,并对实现过程进…

    编程 2025-04-29
  • 学习Python对学习C语言有帮助吗?

    Python和C语言是两种非常受欢迎的编程语言,在程序开发中都扮演着非常重要的角色。那么,学习Python对学习C语言有帮助吗?答案是肯定的。在本文中,我们将从多个角度探讨Pyth…

    编程 2025-04-29
  • Python被称为胶水语言

    Python作为一种跨平台的解释性高级语言,最大的特点是被称为”胶水语言”。 一、简单易学 Python的语法简单易学,更加人性化,这使得它成为了初学者的入…

    编程 2025-04-29
  • c# enum转换成string

    本文将从以下几个方面详细阐述c#中enum类型转换成string类型的方法及注意事项。 一、基本语法和示例 c#中的enum类型可以看作是一组有名字的常量值,通常用于定义一组相关的…

    编程 2025-04-29
  • OpenJudge答案1.6的C语言实现

    本文将从多个方面详细阐述OpenJudge答案1.6在C语言中的实现方法,帮助初学者更好地学习和理解。 一、需求概述 OpenJudge答案1.6的要求是,输入两个整数a和b,输出…

    编程 2025-04-29
  • Python按位运算符和C语言

    本文将从多个方面详细阐述Python按位运算符和C语言的相关内容,并给出相应的代码示例。 一、概述 Python是一种动态的、面向对象的编程语言,其按位运算符是用于按位操作的运算符…

    编程 2025-04-29
  • Python语言由荷兰人为中心的全能编程开发工程师

    Python语言是一种高级语言,很多编程开发工程师都喜欢使用Python语言进行开发。Python语言的创始人是荷兰人Guido van Rossum,他在1989年圣诞节期间开始…

    编程 2025-04-28
  • Python语言设计基础第2版PDF

    Python语言设计基础第2版PDF是一本介绍Python编程语言的经典教材。本篇文章将从多个方面对该教材进行详细的阐述和介绍。 一、基础知识 本教材中介绍了Python编程语言的…

    编程 2025-04-28
  • Python语言实现人名最多数统计

    本文将从几个方面详细介绍Python语言实现人名最多数统计的方法和应用。 一、Python实现人名最多数统计的基础 1、首先,我们需要了解Python语言的一些基础知识,如列表、字…

    编程 2025-04-28
  • Python作为中心语言,在编程中取代C语言的优势和挑战

    Python一直以其简单易懂的语法和高效的编码环境而著名。然而,它最近的发展趋势表明Python的使用范围已经从脚本语言扩展到了从Web应用到机器学习等广泛的开发领域。与此同时,C…

    编程 2025-04-28

发表回复

登录后才能评论