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

本文介绍了C语言作为过程式编程语言的特性,以及32位汇编中的基本数据类型和相关指令。通过实例展示了C语言中的基本数据类型如何转化为汇编语言,并详细解析了栈中结构的变化,帮助读者理解C语言到汇编的转换过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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,%ebpmovl %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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值