实验环境: x86 GCC 7.4.0
C语言代码:
mov指令实现赋值语句
1 | void foo() { |
1 | movb $97, -15(%rbp) |
运算, 按照C语言语法进行类型隐式转换, 这里movsbl将c按符号拓展转化成32位.
1 | void foo() { |
1 | movl $1, -12(%rbp) |
1 | int foo() { |
1 | movl $1, -8(%rbp) |
cmpl 比较两个值
jle跳转等价与C语言的goto语句
1 | int foo() { |
if-else
1 | int foo() { |
1 | movl $100, -8(%rbp) |
然后试一下更复杂的condition
1 | int foo() { |
1 | movl $100, -8(%rbp) |
可以发现条件循环对应的汇编也就是对条件取反之后一步步的判断.
1 | int foo() { |
1 | movl $1, -8(%rbp) |
1 | int foo() { |
1 | movl $0, -8(%rbp) |
可以看出for循环和while循环的行为效率是一致的.
1 | pushq %rbp |
每个函数的汇编部分都包含了以上两条代码, 其中第一条 push %rbp 是保存了上一个函数的栈帧指针, movq %rsp, %rbp 使栈顶指针指向 %rbp.
… 未完