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