C
#include <stdio.h>
int main(int argc, char** argv) {
int ret = printf("%s\n", argv[argc-1]);
return ret; // number of characters printed
}
argc
是命令行的参数个数argv[]
是argc
个参数,其中第0
个参数是程序名main
,以后的参数命令行后面跟的用户输入的参数
argv[]
数组中至少有一个指针指向main( )
函数,即argv[0]
.
GDB
参考指令集:Summary of GDB commands for x86-64 Systems
x86-64寄存器内部关系
现代x86_64处理器具有64位寄存器,可以以backward-compatible方式用作32位寄存器,16位寄存器甚至8位寄存器。
寄存器 rax/eax/ax/al 内部结构关系:
|63..32|31..16|15-8|7-0|
|AH. |AL.|
|AX......|
|EAX............|
|RAX...................|
0x1122334455667788
================ rax (64 bits)
======== eax (32 bits)
==== ax (16 bits)
== ah (8 bits)
== al (8 bits)
Assembly
Registers 根据 Calling Convention 可被分为两种:caller-save register 和 callee-save register.
callee-save register 由 callee 负责 push 进
或者 pop 出
stack
。
callee 要用 callee-save register 前, 需要先将其值 push 至 stack,用完后再 pop 出 stack,恢复 callee-save register 原始值。因此,对 caller 而言,该 register 值在调用前后保持一致。