深入理解计算机系统读书笔记之程序的跳转

        跳转指令有几种不同的编码,但最常用的一些是PC相关的(PC-relative, PC = Program Counter)。也就是,他们会将目标指令的地址与紧跟在跳转指令后面那条指令的地址之差作为编码。

        我们用例子来验证上面这句话,先写个简单的C程序:

#include <stdio.h> int main (int argc, char *argv[]) { int a = 1; int b = 2; if (a > 0) { a += b; } return 0; }

然后转化为汇编代码,用gdb调试,设好断点,程序运行起来后,进入断点,输入disassemble /r,可以看到如下代码:

Dump of assembler code for function main: 0x08048074 <main+0>: 90 nop 0x08048075 <main+1>: 8d 4c 24 04 lea 0x4(%esp),%ecx 0x08048079 <main+5>: 83 e4 f0 and $0xfffffff0,%esp 0x0804807c <main+8>: ff 71 fc pushl -0x4(%ecx) 0x0804807f <main+11>: 55 push %ebp 0x08048080 <main+12>: 89 e5 mov %esp,%ebp 0x08048082 <main+14>: 51 push %ecx 0x08048083 <main+15>: 83 ec 10 sub $0x10,%esp 0x08048086 <main+18>: c7 45 f4 01 00 00 00 movl $0x1,-0xc(%ebp) 0x0804808d <main+25>: c7 45 f8 02 00 00 00 movl $0x2,-0x8(%ebp) 0x08048094 <main+32>: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) 0x08048098 <main+36>: 7e 06 jle 0x80480a0 <main+44> 0x0804809a <main+38>: 8b 45 f8 mov -0x8(%ebp),%eax 0x0804809d <main+41>: 01 45 f4 add %eax,-0xc(%ebp) 0x080480a0 <main+44>: b8 00 00 00 00 mov $0x0,%eax 0x080480a5 <main+49>: 83 c4 10 add $0x10,%esp 0x080480a8 <main+52>: 59 pop %ecx 0x080480a9 <main+53>: 5d pop %ebp 0x080480aa <main+54>: 8d 61 fc lea -0x4(%ecx),%esp 0x080480ad <main+57>: c3 ret End of assembler dump.

我们看main+36这里0x08048098 <main+36>:     7e 06    jle    0x80480a0 <main+44>

7e 06就是机器码了,7e就是jle,而程序的跳转地址0x80480a0 = 06 + 0x804809a(下一条指令的地址),而06并不是真正的跳转地址。

你可能感兴趣的:(c,汇编,function,读书)