栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言与at&t汇编 (LINUX) 一 基本数据类型

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言与at&t汇编 (LINUX) 一 基本数据类型

C语言 “高级汇编语言”。

汇编语言对应着机器语言,也就是0和1,汇编只是让机器语言更易读。但汇编语言就是一系列的指令,并没有相应的规范来便于人们编写代码,一般人 是想到那就写到哪,代码混乱不堪。
后来有人提出了过程式编程语言,这些语言定义了流程控制语句,分为顺序,循环,分支。并用函数来使程序分成一个个模块。而C语言就是其中翘楚。每句C语言都会被翻译为相应的汇编语言。不相信吗?
随我进入C和汇编的世界吧、

第一章 基本数据类型

C语言有以下基本数据类型。

数据类型数据类型32位系统下字节数
charunsigned char1
shortunsigned short2
intunsigned int4
longunsigned long4
long longunsigned long long8
float4
double8

32位汇编有一下3中mov指令

指令名作用
movb移动一个字节
movw移动2个字节
movl移动4个字节
int main(void)
{
	int num=99;
	return num;
}

简单的打印一个整数。而他的汇编呢?

.section rodata
.section text
.globl main
main:
	pushl %ebp
	movl %esp,%ebp
	subl $4,%esp
	
	movl $99,-4(%ebp)
	
	movl -4(%ebp),%eax		
	
	movl %ebp,%esp
	popl %ebp
	ret

main函数以pushl %ebp movl %esp,%ebp 和 movl %ebp,%esp popl %ebp ret开始,结束。运行到subl $4,%esp前栈中的结构是

%esp  %ebp->     old %ebp

subl $4,%esp后栈中结构

%esp->空值
%ebp->old %ebp 

空值就是num占用的内存。

movl $99,-4(%ebp) 就是 int num=99;

想看到结果则,运行程序

gcc 1.c
./a.out
echo $?

看是否打印99,修改 movl $1,-4(%ebp) 再编译运行看是不是为1。

再看一些其他代码

int main(void)
{	
	int num1=22;
	int num2=33;
	int tmp;
	
	tmp=num1;
	num1=num2;
	num2=tmp;

	return num1;
}

看看汇编代码

.section .text
.globl main
main:
	pushl %ebp
	movl %esp,%ebp
	subl $12,%esp
	
	movl $22,-12(%ebp)
	movl $33,-8(%ebp)
	
	movl -12(%ebp),%eax
	movl %eax,-4(%ebp)	
	
	movl -8(%ebp),%eax
	movl %eax,-12(%ebp)	
		
	movl -4(%ebp),%eax
	movl %eax,-8(%ebp)	
	
	movl -12(%ebp),%eax	
		
	movl %ebp,%esp
	popl %ebp	
	ret	

运行到subl $12,%esp前栈中的结构是

		%esp->		空3
					空2
					空1
		%ebp->     	old %ebp

subl $12,%esp后栈中结构

		%esp->		num1
					num2
					tmp
		%ebp->     	old %ebp

movl $22,-12(%ebp) 对应int num1=22;
movl $22,-12(%ebp) 对应int num2=33;
movl $33,-8(%ebp) 对应 int num1=22;

再看一个其他的例子。
关于char类型

int main(void)
{
	char ch='A';
	return ch;
}
.section .text
.globl main
main:
	pushl %ebp
	movl %esp,%ebp
	subl $1,%esp
	movb $'A',-1(%ebp)
	
	movzbl -4(%ebp),%eax
		
	movl %ebp,%esp
	popl %ebp
	ret

char占用一个字节,所以申请一个字节。subl $1,%esp

int main(void)
{
	short s=12;

	return s;	
}
.section .text
.globl main
main:
	pushl %ebp
	movl %esp,%ebp
	subl $2,%esp
	movb $12,-2(%ebp)
	
	movzbl -2(%ebp),%eax
		
	movl %ebp,%esp
	popl %ebp
	ret

int 占用2个字节,所以申请一个字节。subl $2,%esp

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/960961.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号