Linux kernel-汇编基础
mov
ASSEMABLE            C LANGUAGE
movl %eax,%edx     edx = eax;                --->register mode
movl $0x123,%edx   edx = 0x123;              --->immediate (0x123 is a value)
movl 0x123,%edx    edx = *(int32_t *)0x123   --->direct (0x123 is memory address)
movl (%ebx),%edx   edx = *(int32_t *)ebx     --->indirect (fetch address from register ebx, and fetch the value from the address )
movl 4(%ebx),%edx  edx = *(int32_t *)(ebx+4) --->displaced (address from register and offset)
movb
movw
movl
movq
b,w,l,q:  8bit, 16bit, 32bit, 64bit
几个重要指令pushl, popl, call, ret
pushl %eax  ==  subl $4, %esp
                movl %eax, (%esp)
popl %eax  ==  movl (%esp), %eax
               addl $4, %esp
call 0x12345 == pushl %eip(*)
                movl $0x12345, %eip(*)
ret          == popl %eip(*)
push - 栈顶地址减少8个字节(64位,如果32位就是4个字节)
pop - 栈顶地址增加8个字节(64位)
cs寄存器: 代码段寄存器
cs:rip - 总是指向下一条指令地址
call: 将当前cs:rip 的值压入栈顶, cs:rip 指向的是被调用函数的入口地址
ret: 从栈顶弹出原来保存在这里的cs:rip的值,放到cs:rip 
函数调用关系
//建立被调用者函数的堆栈框架
pushl %ebp   //我的理解,在这里,默认%esp就是比%ebp要加1的
movl %esp, %ebp
///被调用函数的函数体
///do sth
///
//拆除被调用者的堆栈框架
movl %ebp, %esp
popl %ebp
ret
分析case
...
pushl $8
movl  %esp, %ebp
subl  $4, %esp
movl  $8, (%esp)
...
#cat hello.c
#include <stdio.h>
int g(int x)
{
	return x + 3;
}
int f(int x)
{
	return g(x);
}
int main(void)
{
	return f(8) + 1;
}
#gcc -S -o hello.s hello.c
#cat  hello.s
g:
	pushq	%rbp
	movq	%rsp, %rbp
	movl	%edi, -4(%rbp)
	movl	-4(%rbp), %eax
	addl	$3, %eax
	popq	%rbp
	ret
f:
	pushq	%rbp
	movq	%rsp, %rbp
	subq	$8, %rsp
	movl	%edi, -4(%rbp)
	movl	-4(%rbp), %eax
	movl	%eax, %edi
	call	g
	leave
	ret
main:
	pushq	%rbp
	movq	%rsp, %rbp
	movl	$8, %edi
	call	f
	addl	$1, %eax
	popq	%rbp
	ret
												
											Linux kernel-汇编基础的更多相关文章
- Linux Kernel系列三:Kernel编译和链接中的linker script语法详解
		
先要讲讲这个问题是怎么来的.(咱们在分析一个技术的时候,先要考虑它是想解决什么问题,或者学习新知识的时候,要清楚这个知识的目的是什么). 我在编译内核的时候,发现arch/arm/kernel目录下有 ...
 - 如何进行Linux Kernel 开发
		
转自:http://www.cppblog.com/flyonok/archive/2011/04/15/144316.html 如何进行Linux Kernel 开发? (Take 3) 译者序:这 ...
 - Linux Kernel - Debug Guide (Linux内核调试指南 )
		
http://blog.csdn.net/blizmax6/article/details/6747601 linux内核调试指南 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级 ...
 - Linux Kernel 0.12 启动简介,调试记录(Ubuntu1804, Bochs, gdb)
		
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...
 - Linux Kernel代码艺术——系统调用宏定义
		
我们习惯在SI(Source Insight)中阅读Linux内核,SI会建立符号表数据库,能非常方便地跳转到变量.宏.函数等的定义处.但在处理系统调用的函数时,却会遇到一些麻烦:我们知道系统调用函数 ...
 - Linux Kernel sys_call_table、Kernel Symbols Export Table Generation Principle、Difference Between System Calls Entrance In 32bit、64bit Linux
		
目录 . sys_call_table:系统调用表 . 内核符号导出表:Kernel-Symbol-Table . Linux 32bit.64bit环境下系统调用入口的异同 . Linux 32bi ...
 - Intel 80x86 Linux Kernel Interrupt(中断)、Interrupt Priority、Interrupt nesting、Prohibit Things Whthin CPU In The Interrupt Off State
		
目录 . 引言 . Linux 中断的概念 . 中断处理流程 . Linux 中断相关的源代码分析 . Linux 硬件中断 . Linux 软中断 . 中断优先级 . CPU在关中断状态下编程要注意 ...
 - Linux Kernel中断子系统来龙去脉浅析【转】
		
转自:http://blog.csdn.net/u011461299/article/details/9772215 版权声明:本文为博主原创文章,未经博主允许不得转载. 一般来说,在一个device ...
 - Linux Kernel CMPXCHG函数分析
		
原文地址:http://blog.csdn.net/penngrove/article/details/44175387 最近看到Linux Kernel cmpxchg的代码,对实现很不理解.上网查 ...
 - arm linux kernel 从入口到start_kernel 的代码分析
		
参考资料: <ARM体系结构与编程> <嵌入式Linux应用开发完全手册> Linux_Memory_Address_Mapping http://www.chinaunix. ...
 
随机推荐
- Canny算法源码,欢迎交流
			
http://blog.csdn.net/jianxiong8814/article/details/1563109 http://blog.csdn.net/assuper/article/deta ...
 - 模式识别之ocr---文字识别Tesseract-OCR 进行文字识别 VS2010
			
近日做铸件文字识别的项目,需要识别铸件上的字符和数字,找到开源的识别库Tesseract,下面简单记录下怎么使用. 首先在项目主页http://code.google.com/p/tesseract- ...
 - DEDE织梦 后台特别卡,有时响应超时的解决办法
			
跟大家一样,大致情况是: 1.打开后台首页第一次没问题,但是刷新或者点其他菜单就一直卡着了. 2.关掉浏览器重新进首页没问题,但是一旦进了首页再打开php页面就卡死了. 3.服务器返回Maximum ...
 - 扩展欧几里得模板&逆元求法
			
拓展欧几里得: 当 gcd ( a , b )= d 时,求绝对值和最小的 x , y 使得 x * a + y * b = d : d = gcd ( a , b ) = gcd ( b , a m ...
 - C#中,JSON字符串转换成对象。
			
在前台提交(post)的数据中.除了强类型的数据外,还有一个额外的json数据提交 在这里我的办法是,在前台把json对象转换成字符串,然后提交. 测试demo 前台: @using(Html.Beg ...
 - 蓝牙驱动分析 linux
			
蓝牙驱动分析 这个驱动分析的是OK6410开发板自带的内核版本是linux3.0.1,所支持的wifi和蓝牙一体芯片是marvell的8688和8787.根据开发板的设计,芯片与主机之间是通过sdio ...
 - 学习MAP 地图好地址
			
http://www.cnblogs.com/beniao/archive/2010/01/13/1646446.html Bēniaǒ成长笔记在IT江湖里我不是一名老手,我只是一名普通的程序员,愿意 ...
 - 利用 C# dynamic 减少创建模型类
			
C# 的 dynamic 关键字可以是C#可以像 javascript 这种弱类型语言一样具有随时可以添加属性的能力.C# 是一种强类型语言,dynamic 要摆脱类型的限制,自然是有代价的.这里不讨 ...
 - [Codeforces 986E] Prince's Problem
			
[题目链接] https://codeforces.com/contest/986/problem/E [算法] X到Y的路径积 , 可以转化为X到根的路径积乘Y到根的路径积 , 除以LCA到根的路径 ...
 - OPENCL 错误码
			
#define CL_SUCCESS 0 #define CL_DEVICE_NOT_FOUND -1 #define CL_DEVICE_NOT_AVAILABLE -2 #define CL_CO ...