汇编
文章平均质量分 62
lylhw13_
喜欢探究Linux源码,喜欢从本质分析问题
展开
-
一幅图帮助理解C函数的调用栈
调用栈及栈帧对于理解程序的行为非常重要。本文以x86 程序的默认调用方式为例,说明函数调用栈的详细布局。原始程序以如下一段程序为例:int fun(int i, int j);int callee(int i, int j) { int a = i, b = j; return fun(a, b);}int caller(void) { return callee(1, 2);}汇编代码为了得到程序执行过程中的具体细节,需要查看其汇编语言。使用Compi原创 2021-11-14 23:13:04 · 891 阅读 · 0 评论 -
人人都可以写协程:一个基于汇编的协程实现
本文以有栈非对称协程的实现为例。项目源码在 https://github.com/lylhw13/Coroutine-in-C。准备基本概念编写协程前需要明白几个概念:有栈协程和无栈协程有栈协程:通过保存运行时的堆栈及运行时的上下文来保存运行状态,需要改变调用栈。无栈协程:通过闭包或者状态机的方法记录程序的运行状态,不改变调用栈。对称协程和非对称协程对称协程:各协程之间可以进行执行权的切换。非对称协程:有一个中心化的调度器,所有协程都只和调度器进行执行权的切换。已有的实现案例原创 2021-11-13 23:16:37 · 1016 阅读 · 0 评论 -
一段程序说明C语言不同调用约定的区别
在 x86-64 平台编译 32位程序gcc version$ gcc -vgcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)gcc -m32 -S test.ccdecl32位默认的调用方式是 cdeclint callee(int,int,int);int caller(void) { return callee(1,2,3) + 5;}caller:.LFB0: endbr32 pushl %ebp原创 2021-11-04 00:36:12 · 298 阅读 · 0 评论 -
Intel汇编和AT&T汇编的简要区别,生成方法和判断技巧
x86 汇编有两种格式:AT&T 和 Intel,但是这两种格式的操作数 (Operand) 的方向完全相反,容易让人产生疑惑。Unix 系主要是 AT&T 语法格式,Windows系 主要是 Intel 语法格式。insn source, destination # AT&T syntax 方向为 src => dstinsn destination, source ; Intel syntax 类似于编程语言中的 dst = src;快速判断方原创 2021-11-02 21:26:09 · 2369 阅读 · 0 评论 -
解析Linux中的 likely 和 unlikely
Linux 中多处出现 likely 和 unlikely 的使用,它们的定义如下:# define likely(x) __builtin_expect(!!(x), 1)# define unlikely(x) __builtin_expect(!!(x), 0)函数原型__builtin_expect 是 GCC 提供的内置函数 (built-in functions),函数原型是long __builtin_expect (long exp, long c)函数的返回值是 exp,它原创 2021-06-21 19:40:42 · 335 阅读 · 0 评论 -
c 语言中对字符串常量修改的错误原因解析
#include <stdio.h>int main(){ char *a = "hello"; a[0] = 'w'; printf("%s\n", a); return 0;} .file "t_str.c" .section .rodata.LC0: .string "hello" .text .globl main .type main, @functionmain:.LFB0:原创 2021-06-12 09:51:48 · 995 阅读 · 1 评论 -
汇编 movl %gs:20, %eax 的作用
int main(){ int a[2][3]= {{1,2,3},{4,5,6}}; return 0;} pushl %ebp movl %esp, %ebp pushl %ecx subl $36, %esp movl %gs:20, %eax movl %eax, -12(%ebp) xorl %eax, %eax movl $1, -36(%ebp) movl原创 2021-06-10 23:05:56 · 4464 阅读 · 0 评论