首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

变量究竟存储在什么地方?

0 图 1典型ELF可重定位目标文件(数字代表索引) 夹在ELF头和头部表之间都是(section),各个意思如下: 含义 .text 已编译程序机器代码 .rodata 只读数据,....line 原始C程序行号和.text中机器指令之间映射 .strtab 一个字符串表,其内容包含.systab和.debug符号表 对于static类型变量,gcc编译器在.data...Vis 目前还没有查到资料,待以后改正 Ndx 通过索引来表示每个 ABS:不该被重定位符号 UND:代表未定义符号(在其他地方定义)...变量c对应索引为4(.bss段),变量a对应索引是COM,最终当该程序被链接,它将做为一个.bss目标分配。...data段中变量b和c也是类似的情况。swap和main都在索引1所对应.text段中。由于printf是在库中所定义,所以索引为UND。 符号表中不包含对应于本地非静态程序变量中任何符号。

1.7K10

C和汇编如何互相调用?嵌入式工程师必须掌握

一、gcc 内联汇编 内联汇编即在C中直接使用汇编语句进行编程,使程序可以在C程序中实现C语言不能完成一些工作,例如,在下面几种情况中必须使用内联汇编或嵌入型汇编。...& 表示该输出操作数不能使用输入部分使用寄存器,只能用"+&"或"=&"方式使用 「input(C->asm)」用于定义输入参数,可以是变量也可以是立即数: :"constraint" (...并且堆栈操作是8字对齐。...在汇编程序中使用PRESERVE8伪操作告诉连接器,本汇编程序是8字对齐. 3、参数传递规则: 根据参数个数是否固定,可以将子程序分为参数个数固定子程序和参数个数可变子程序.这两种子程序参数传递规则是不同.... 1.参数个数可变子程序参数传递规则 对于参数个数可变子程序,当参数不超过4个,可以使用寄存器R0~R3来进行参数传递,当参数超过4个,还可以使用数据栈来传递参数.

1.4K40
您找到你想要的搜索结果了吗?
是的
没有找到

X86 寻址方式、AT&T 汇编语言相关知识、AT&T Intel 汇编语言比较、gcc 嵌入式汇编

在Linux 下有两种方式,一种是使用汇编程序GAS 和连接程序ld,一种是使用gcc。...其中,扩展名必须为大写S,这是因为,大写S 可以使gcc 自动识别汇编程序中C 预处理命令,像#include、#define、#ifdef、#endif 等,也就是说,使用gcc 进行编译,你可以在汇编程序中使用...指令中有几个操作数,就说明有几个变量需要与寄存器结合,由gcc 在编译根据后面输出部分和输入部分约束条件进行相应处理。...由于这些样板操作数前缀使用了“%”,因此,在用到具体寄存器就在前面加两个“%”,如%%cr0。...\n”是换行符,“\t”是tab 符,在每条命令结束加这两个符号,是为了让gcc 把嵌入式汇编代码翻译成一般汇编代码能够保证换行和留有一定空格。

3K00

第014课 Jz2400_ARM异常中断体系详解

第001_概念引入处理流程 取个场景解释中断。 假设有个大房间里面有小房间,婴儿正在睡觉,他妈妈在外面看书。 问:这个母亲怎么才能知道这个小孩醒?...(由软件决定) 第002CPU模式(Mode)状态(State)寄存器 这课我们来讲CPU工作模式(Mode) 状态(State)寄存器 7种Mode: usr/sys undefined(...下课会演示使用Thumb指令集编译,看是否生成bin文件会变小很多 ?...我们说过Thumb指令集并不重要,本节演示把一个程序使用Thumb指令集来编译它 使用上一章重定位代码,打开Makefile和Start.S Makefile文件 all: arm-linux-gcc...se-preview-section-delimiter"> 这视频我们讲解了swi处理流程 第006按键中断程序示例概述初始 在前面的视频里我们举了一个例子,母亲看书被声音打断,远处声音来源有多种多样

1.5K20

【嵌入式开发】ARM 处理器工作模式 及 修改方法 ( 处理器模式 | 设置处理器模式 | 程序状态字寄存器 CPSR SPSR | 模式设置代码编写 | 设置 svc 模式 )

使用 orr 指令 进行设置 ; ( 1 ) ORR 汇编指令 语法 : ORR{条件}{S} , , , dest 结果是 op 1 op 2 进行或运算结果...中导出寄存器值 对应 0 ~ 4 位 清0, 使用 bic r0, r0, #0x1f, 将 R0 寄存器 #0x1f 进行 操作, 即 后5 位都设置成0, 然后将 操作结果保存到...R0 寄存器中 ; 5.将 R0 中 M 位 设置 模式代码 : 在下图中, svc 模式代码 0b10011 ( 二进制 ), 即 0x13 ( 十六进制 ), 使用 orr r0, r0,...代码为 ENTRY(_start) ; 3.设置代码段 : 使用 .text : 设置代码段; 4.设置数据段 : 使用 .data : 设置数据段; 5.设置 BSS 段 : 使用 .bss :..., 使用 . = ALIGN(4); 设置四字对齐即可; 7.代码示例 : OUTPUT_ARCH(arm) /*指明处理器结构*/ ENTRY(_start)

3K40

《深入理解计算机系统》阅读笔记--程序机器级表示(上)

GCC c语言编译器以汇编代码形式产生输出,汇编代码是机器代码文本表示,给出程序中每一条指令。然后GCC调用汇编和链接器,根据汇编代码生成可执行机器代码。...编译器产生两个源文件汇编代码,名字分别为p1.s 和p2.s 汇编器会将汇编代码转换为二进制目标文件p1.o 和p2.o 链接器将两个目标代码文件实现库函数代码合并,并最终生成可执行文件p 对于机器级编程...,不需要访问该程序源代码或汇编代码 反汇编使用指令命令规则GCC生成汇编代码使用有些区别,在上面的示例中,它省略了很多指令结尾q,这些后缀是大小指示符,可以省略 四、数据格式 由于是从16位体系结构扩展成...即$后面跟一个用标准C表示法表示整数 寄存器:表示某个寄存器内容,16个寄存器低位1字,2字,4字,或者8字一个作为操作数分别对应于8位,16位,32位,或64位。...b,w,l,q分别是1、2、4和8字 ? 源操作数指定值是一个立即数,存储在寄存器中或者内存中,目的操作数指定一个位置,要么是一个内存地址。

72400

内联汇编很可怕吗?看完这篇文章,终结它!

.c 给寄存器起别名 四、使用内存地址 1. test8.c 使用内存地址来操作数据 五、总结 在 Linux 代码中,经常可以看到在 C 代码中,嵌入部分汇编代码,这些代码要么是硬件体系相关,要么是对性能有关键影响...指令格式 asm [volatile] ("汇编指令" : "输出操作数列表" : "输入操作数列表" : "改动寄存器") 格式说明 汇编指令:基本asm格式相同; 输出操作数列表:汇编代码如何把处理结果传递到...别急,如果您觉得使用编号还是麻烦,容易出错,还有另一个更方便操作:扩展 asm 格式还允许给这些占位符重命名,也就是给每一个寄存器起一个别名,然后在内联汇编代码中使用别名来操作寄存器。...:给寄存器(gcc 编译器选择)取了一个别名 v3; 输入操作数列表:给寄存器(gcc 编译器选择)取了一个别名 v1 和 v2; 起立别名之后,在内联汇编代码中就可以直接使用这些别名( %[v1]...在操作那些内存地址中数据使用仍然是按顺序编号占位符。

1.9K20

AT&T汇编语言GCC内嵌汇编简介

AT&T汇编语言GCC内嵌汇编简介 1 AT&T INTEL汇编语言语法区别 1.1大小写 1.2操作数赋值方向 1.3前缀 1.4间接寻址语法 1.5后缀 1.6指令 2 GCC...3后记 本节先介绍 AT&T汇编语言语法INTEL汇编语法差别,然后介绍GCC内嵌汇编语法。...使用内嵌汇编,要先编写汇编指令模板,然后将C语言表达式指令操作数相关联,并告诉 GCC对这些操作有哪些限制条件。...寄存器,但是GCC并不去判断%0和%1,是否和同一个C表达式或变量相关联(这样易于产生 内嵌汇编相应汇编代码),因此%0和%1使用寄存器可能不同。...在使用内嵌汇编请记 住一点:尽量告诉GCC尽可能多信息,以防出错。 如果你使用指令会改变CPU条件寄存器cc,需要在修改描述部分增加“cc”。

2K10

叙述 C语言编译

#ifndef _XXX__XXX #define _XXX_XXX #endif 编译(Compiling) 这一环,是把C代码转换为汇编代码并根据需求进行一定程度优化处理。...编译器优化 编译会有一个中间过程,进行优化(前端)后再最终输出汇编代码(后端), gcc 可以通过以下命令查看, 感觉不是给人类看。...我想起工作上遇到使用for 进行简单延时匹配一些硬件操作时序,悲剧了. (输出结果我就不贴上来了。) 中间层优化是和体系代码无关情况下进行,优化后再调用对应体系后端生成汇编代码。...使用objdump对生成ELF进行反汇编 $ objdump -S hello.o hello.o: file format elf64-x86-64 Disassembly of section...GOT中信息需要在动态链接库被程序加载后立刻填写正确。这就给采用动态链接库程序在启动带来了一定额外开销,从而减缓了启动速度。ELF采用了做延迟绑定做法来解决这一问题。

1.7K11

GCC在C语言中内嵌汇编-转载

在内嵌汇编中,可以将C语言表达式指定为汇编指令操作数,而且不用去管如何将C语言表达式值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式汇编指令操作数之间对应关系即可...2、内嵌汇编举例 使用内嵌汇编,要先编写汇编指令模板,然后将C语言表达式指令操作数相关联,并告诉GCC对这些操作有哪些限制条件。...;"%0"和"%1"代表指令操作数,称为占位符,内嵌汇编靠它们将C 语言表达式指令操作数相对应。...input"前面的"r"表示该表达式需要先放入某个寄存器,然后在指令中使用该寄存器参加运算。 C表达式或者变量寄存器关系由GCC自动处理,我们只需使用限制字符串指导GCC如何处理即可。...因此上面的汇编语句代码下面的伪代码等价:btsl nr, ADDR,该指令两个操作数不能全是内存变量,因此将nr限定字符串指定为"Ir",将nr 立即数或者寄存器相关联,这样两个操作数中只有ADDR

2.9K20

Win32 Linux汇编语法区别

指令部分是必须,而其它部分则可以根据实际情况而省略。在将汇编语句嵌入到C代码中操作数如何C代码中变量相结合是个很大问题。...GCC采用如下方法来解决这个问题:程序员提供具体指令,而对寄存器使用则只需给出”样板”和约束条件就可以了,具体如何将寄存器变量结合起来完全由GCC和GAS来负责。...在GCC内联汇编语句指令部中,加上前缀’%'数字(如%0,%1)表示就是需要使用寄存器”样板”操作数。...凡是输出部中说明操作数相结合寄存器或操作数本身,在执行完嵌入汇编代码后均不保留执行之前内容,这是GCC在调度寄存器使用依据。...· 内联汇编语句最后一个部分告诉GCC它将改变寄存器eax中值,GCC在处理不应使用该寄存器来存储任何其它值。

2.4K40

Go汇编语法和MatrixOne使用介绍

Go汇编语法特点 - 操作数顺序 - 寄存器宽度标识 - 函数调用约定 对写Go汇编代码有帮助工具 - avo - text/template - 在Go汇编代码中使用宏 在MatrixOne...Go汇编语法特点 根据Rob PikeThe Design of the Go Assembler,Go使用汇编语言并不严格CPU指令一一对应,而是一种被称作Plan 9 assembly“伪汇编...从效果上来看,CMP类似于SUB指令只修改EFLAGS标志位,不修改操作数。而在Go汇编中,CMP是以第一个操作数减去第二个操作数SUB相反)结果来设置标志位。...在这个例子中,我们介绍如何使用Go汇编以AVX2指令集实现int8类型向量加法(假设数组已经按32字填充)。 由于AVX2一共有16个256位寄存器,我们希望在循环展开中把它们全部使用上。...如果是用C/C++,可以使用编译器内置intrinsics函数(gcc和clang皆提供)来调用,还算方便。遗憾是Go语言并不提供intrinsics函数。遇到这样场景,汇编是唯一解决办法。

51230

《深入理解计算机系统》(CSAPP)读书笔记 —— 第三章 程序机器级表示

它不需要访问该程序源代码或汇编代码 反汇编使用指令命名规则GCC生成汇编代码使用有些细微差别。在我们示例中,它省略了很多指令结尾‘q’。...,不知道指令意思,可以看操作数格式这一中总结常见汇编指令格式。...我们对GCC实验表明,只有当两个表达式都很容易计算,例如表达式分别都只是条加法指令,它才会使用条件传送。...当使用较髙优化等级编译,例如使用命令行选项-O1,GCC会采用这种策略。 跳转到中间   如下图所示为while循环写计算阶乘代码。...guarded-do   下图为使用第二种方法编译汇编代码,编译是用是-O1,GCC就会采用这种方式编译循环。 ?

2K30

深入理解编译、链接和运行(obj文件组成格式分析,可执行文件组成格式分析)

下面以图示方式说明这4GB虚拟地址空间布局是什么样。 用户空间分析: (1)保留区:很多情况下,正是由于我们对虚拟地址空间布局不熟悉所以编写出错程序。...测试环境:ubuntu18.04 + gcc 测试工具:逆向和反汇编工具 objdump和readelf 测试代码: int gdata1 = 10; //.data int...、编译和汇编,最终生成可执行文件,其中在windows下生成 .obj文件,在linux下生成 .o文件,学名叫做二进制可重定位文件 (1)预编译:gcc -E *.c -o *.i 预编译要干的事情...(2)编译:gcc -S *.i -o *.s 词法分析、语法分析和语义分析、代码优化、编译、汇总所有的所有的符号 (3)汇编gcc -c *.s -o *.o 将汇编指令转换为特定平台下机器语言...由于源文件是单独编译,所以对外部符号处理为*UND*即undefine。

1.7K30

gcc内嵌汇编详解

有时候我们希望在C/C++代码中使用嵌入式汇编,因为C中没有对应函数或语法可用。...入门 在C中嵌入汇编最大问题是如何将C语言变量指令操作数相关联。当然,gcc都帮我们想好了。下面是是一个简单例子。...这样gcc就知道如何将这条嵌入式汇编语句转成实际汇编指令了: fsinx:汇编指令名 %1, %0:汇编指令操作数 “=f”(result):操作数%0是一个浮点寄存器,变量result关联(对输出操作数...,“关联”意思就是说gcc执行完这条汇编指令后会把寄存器%0内容送到变量result中) “f”(angle):操作数%1是一个浮点寄存器,变量angle关联(对输入操作数,“关联”意思是就是说...注意这样操作数不能使用”=”符号,因为gcc看到”=”符号会认为这是一个单输出操作数,于是在将嵌入汇编转换为真正汇编时候就不会预先将变量a值加载到寄存器%0中。

2.8K20

Arm放弃了自家汇编语法?改投GNU了?

,_等(由点、字母、数字、下划线等组成,除局部标号外,不能以数字开头)字符组成,标号后面加“:”。 段内标号地址值在汇编确定; 段外标号地址值在连接确定。 3....宏操作可以使用一个或多个参数,当宏操作被展开,这些参数被相应值替换。...{,max} 通过用零或指定数据进行填充来使当前位置指定边界对齐 .align 4 --- 16字对齐 24次方 .align (4) --- 4字对齐 .org .org...ADR伪指令为小范围地址读取伪指令,使用相对偏移范围:当地址值是字节对齐 (8位) ,取值范围为-255~255,当地址值是字对齐 (32位) ,取值范围为-1020~1020。...在Linux OS上,为了运行可执行文件,他们是遵循ELF格式,通常gcc -o test test.c,生成test文件就是ELF格式,这样就可以运行了,执行elf文件,则内核会使用加载器来解析

2.1K30

程序编译、链接、装载运行

gcc可以使用如下命令对C语言进行预编译并且把预编译结果输出到hello.i文件中 gcc -E hello.c -o hello.i 编译 编译就是对预处理之后文件进行词法分析、语法分析、语义分析并优化后生成相应汇编文件...我们使用如下命令来编译预处理之后文件 gcc -S hello.i -o hello.s 或者我们也可以把预处理和编译合为一步 gcc -S hello.c -o hello.s 汇编 汇编目的是把汇编代码转化为机器指令...我们可以使用如下命令实现汇编 gcc -c hello.s -o hello.o 或者我们也可以直接把源代码文件编译为目标文件 gcc -c hello.c -o hello.o 汇编操作所生成文件叫做目标文件...,保存操作系统内核数据,用户进程无权访问该地址 Stack(栈) 用于实现程序中函数调用,在下一程序运行中我们会详细了解栈工作方式 Heap(堆) 为了保存在程序运行时(而非编译)产生全局变量注...相较于gcc支持AT&T和Intel格式汇编,我更喜欢NASM汇编语法,下面是使用NASM实现向标准输出打印字符串汇编代码 global _start ; _start是一个符号(.symbol

1.3K10

go语言调度器源代码情景分析之六:go汇编语言

go汇编格式跟前面讨论过AT&T汇编基本上差不多,但也有些重要区别,本节就这些差异做一个简单说明。 寄存器 go汇编语言中使用寄存器名字AMD64不太一样,下表显示了它们之间对应关系: ?...go汇编函数定义、函数调用、全局变量定义以及对其引用会用到这个SB虚拟寄存器。对于这个虚拟寄存器,我们不用过多关注,在代码中看到它知道它是一个虚拟寄存器就行了。...操作码 AT&T格式寄存器操作码一般使用小写且寄存器名字前面有个%符号,而go汇编使用大写而且寄存器名字前没有%符号,比如: # AT&T格式 mov %rbp,%rsp # go汇编格式 MOVQ...BP,SP 操作数宽度(即操作数位数) AT&T格式汇编指令中如果有寄存器操作数,则根据寄存器名字(比如rax, eax, ax, al分别代表64,32,16和8位寄存器)就可以确定操作数到底是多少位...go汇编还有一些用法比较特别的地方,现在不讨论,等我们分析源代码遇到它们再结合上下文做详细说明。

1.3K31
领券