从C语言到汇编(二)算术运算

变量,常量,运算符可以构成表达式,表达式也可以构成语句。
本文将详细介绍加(+),减(-),乘(*),除(/),取余(%)运算符。

#include <stdio.h>
int main(void)
{
   
	int a=10;
	int b=20;
	int c;
	c=a+b;
	printf("sum=%d\n",c);
	
	return 0;
}
sum=30

c语言代码计算了a+b的值,而a=10,b=20,这很容易计算,凭借我们的大脑,就可以计算出结果。
汇编代码

.section .rodata
	.LC0:.string "sum=%d\n"
.text
.global main

main:
	pushl %ebp
	movl %esp,%ebp
	
	subl $12,%esp
	movl $10,-4(%ebp);a
	movl $20,-8(%ebp);b
	movl -4(%ebp),%eax
	addl -8(%ebp),%eax
	movl %eax,-12(%ebp);c
	
	pushl -12(%ebp)
	pushl $.LC0
	call printf
	addl $8,%esp
	
	movl $0,%eax
	leave
	ret

.section .rodata定义只读存储区数据。"sum=%d\n"就是只读字符串,一般跟代码定义在一起。该字符串用于printf函数的输出。
代码定义了int a,b,c,占用了12字节的空间,所以subl $12,%esp在栈中申请了12字节的空间。-4(%ebp)及紧跟着的4个字节代表了变量a,同理-8(%ebp)代表了b,-12(%ebp)代表了c。
movl $10,-4(%ebp)将10赋值给a,movl $20,-8(%ebp)将20赋值给了b。movl -4(%ebp),%eax将a赋值给%eax,addl -8(%ebp),%eax将b与%eax相加,并将结果保存给%eax.。相当于将a+b的值赋值给%eax,
movl %eax,-12(%ebp)将%eax的值赋值给-12(%ebp),相当于将a+b的值赋值给c。
pushl -12(%ebp)将c的值放入栈中。pushl $.LC0将.LC0的地址放入栈中。call printf调用printf函数输出结果。addl $8,%esp清理printf参数所用空间。
用到的指令有

指令 效果 描述
pushl S R[%esp]<-R[%esp]-4 M[R[%esp]]<-S 将双字压入栈
popl D D<-M[R[%esp]] R[%esp]<-R[%esp]+4 将双字出栈
call label 过程调用
add S,D D=D+S

S可以是立即数,寄存器,存储器地址。D可以使寄存器,存储器地址。但S和D不能同时为存储器地址。

#include <stdio.h>
int main(void)
{
   
	int a=1234;
	int b=136;
	int c=a+b;
	printf("sum=%d\n",c);
	
	c=a+121;
	printf("sum=%d\n",c);
	
	return 0;
}
sum=1370
sum=1355

汇编代码

.section .rodata
	.LC0:.string "sum=%d\n"
.text
.global main

main:
	pushl %ebp
	
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值