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

为什么hello world在C中生成的汇编代码不像x86汇编那样有.code段,也没有模型很小?

在C语言中生成的汇编代码与x86汇编代码的差异主要是由于编译器和目标平台的不同所导致的。下面是对这个问题的详细解答:

在C语言中,编译器将源代码转换为汇编代码,然后再由汇编器将其转换为机器码。汇编代码是一种低级的表示形式,它将C语言的高级语法转换为机器指令的形式。

在x86汇编中,通常会有一个明确的代码段(.code segment),用于存放程序的指令。这是因为x86架构的指令集体系结构规定了代码段的存在。

然而,在C语言中生成的汇编代码中,没有明确的代码段(.code segment)的定义。这是因为C语言的编译器通常会生成与特定平台相关的汇编代码,以便更好地利用该平台的特性和优化编译结果。因此,汇编代码中的指令通常会直接放置在全局数据段(.data segment)或者其他段中。

此外,生成的汇编代码可能会比x86汇编代码更大,这是因为C语言中的一些高级语法和特性需要更多的指令来实现。例如,C语言中的函数调用和参数传递机制可能需要额外的指令来处理。

总结起来,C语言中生成的汇编代码与x86汇编代码的差异主要是由于编译器和目标平台的不同所导致的。C语言的编译器会根据特定平台的特性和优化策略生成相应的汇编代码,而不是遵循固定的代码段结构。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

用Rust实现BrainfuckJIT编译器

x64汇编简介 Linux x64 汇编/Hello World 我们每天产出大量垃圾代码,我们每个人都可以像这样简单地编写最简单代码: #include int main()...当然,这将是经典 Hello World! 程序。这是它代码: section .data msg db "Hello World!"...首先看第一和第二行,我们定义了数据部分,并将 msg 常量与 “Hello, World!” 值放在一起。现在,我们可以代码中使用此常量。接下来是声明文本段部分和程序入口。...申请一可写和可执行内存 将源码翻译为机器码(通常经过汇编) 将机器码写入第一步申请内存 执行这部分内存 Hello, JIT World: The Joy of Simple JITs 事不宜迟,...而 Rust 生态也有一个参照 DynASM 所开发项目,也叫 dynasm: https://crates.io/crates/dynasm 为了 Rust 编写汇编代码,我们将使用这个名为

83310

CC++直接插入汇编代码方法-内联汇编

方法总结 案例1 案例2-内联汇编 内联汇编A+B 基础讲解 ---- 方法总结 c语言直接插入汇编 C/C++内嵌汇编(Visual Studio 2019) 案例1 #include <stdio.h...printf("a=%d\nb=%d\nc=%d\n", a, b, c); return 0; } 案例2-内联汇编 内联汇编示例: Hello, World为例: #include #include...内联汇编代码不易于移植,如果你程序打算在不同类型机器(比如x86和Alpha)上运行,应当尽量避免使用内联汇编,这时可以使用MASM,因为MASM支持更方便宏指令和数据指示符。...例如: __asm mov al, 4 __asm mov dx, 0xB0008 __asm out dx, al 上面的两个例子所生成代码是相同,但是括号里__asm块这种方式更具优势...另外,由于大括号里语句和一般MASM语句格式一样,所以可以很方便地从现有的MASM源程序里复制。 不像CC++"{}",__asm块"{}"不会影响CC++变量作用范围。

1.2K30

逆向工厂(一):从hello world开始

静态链接:链接器将函数代码从其所在地(目标文件或静态链接库)拷贝到最终可执行程序,整个过程程序生成时完成。...("hello world!...\n");} 这是我们编写打印hello world程序,是不是看起来很亲切,接下来将编译好hello world程序用IDA反汇编生成代码如下图: ?...\n”压入栈,供printf函数使用,汇编程序代码,如果调用函数参数,都是先将函数参数先用push指令压入栈,例如:add(int a,int b),调用add函数前,先将参数a和b压入栈...这就是hello world程序逆向代码分析,只是举一个简单例子,真正要逆向分析一个较大较复杂程序还是一定难度,需要更多知识与经验。

2.4K80

Golang 汇编入门知识总结

1.1 程序编译过程 以 C 语言为例来说,从 hello.c 源码文件到 hello 可执行文件,经过编译器处理,大致分为几个阶段: 编译器不同阶段会做不同事情,但是一步是可以确定,那就是...相反,编译器使用了一种半抽象指令集,并且部分指令是代码生成后才被选择。...往往分析编译输出汇编时,看到就是硬件 SP 寄存器)。 PC: 实际上就是体系结构知识中常见 pc 寄存器, x86 平台下对应 ip 寄存器,amd64 上则是 rip。...仔细观察上面的进程内存布局图就会发现,我们代码是存储.text ,这里也就是一种约定俗成起名方式。实际上 plan9 TEXT 是一个指令,用来定义一个函数。...4.4.2 变量声明 汇编全局变量,一般是存储.rodata或者.data。对应到 Go 代码,就是已初始化过全局 const、var 变量/常量。

2.4K40

Rust编译过程讲解与环境准备

-emit-llvm hello.c -S -o hello.ll # 导出文本类型LLVM IR第二部:编译将预处理完文件进行一些列词法分析、语法分析、语义分析和优化后生成汇编指令代码。...\n"第三步:汇编汇编代码转变成机器可以执行指令,过程相对编译阶段简单,没有复杂语法,也不需要优化,只需要对照汇编指令和机器指令对照表一一翻译即可。...表描述了各个文件偏移等信息。...* .text section 代码* .data section 数据* .bss section 未初始化全局变量和局部静态变量,文件不占空间。* ...od -x ..../add # 查看ELF文件信息clang -ccc-print-phases hello.c # 查看编译过程Rust编译过程通过前面的介绍,我们知道LLVM一个好处,就是将前端和后端通过IR

31510

Linux内核源码分析 - 系统调用

根据arch/x86/entry/syscalls/Makefile我们可以知道,是对应shell脚本,根据上面的文件来生成c头文件,比如下面两个。...上面的就是对应汇编代码了,这里为了简单,省略掉了该汇编方法其他部分。 那这段汇编代码又是在哪里调用呢?...wrmsrl(MSR_LSTAR, (unsigned long)entry_SYSCALL_64);         ... } 在上面的方法,我们可以看到,汇编代码entry_SYSCALL_64...兴趣可以分析并执行下下面的汇编代码,好好体会下整个系统调用流程。..., world\n" 到这里,系统调用对应kernel space部分就已经分析完毕了,下篇文章我们结合对应c源码,看下user space部分是如何实现

5.5K22

一文看懂eBPF|eBPF简单使用

为了让 Java 经验同学更容易接受 eBPF 技术。我们先介绍一下 Java AOP 概念。 AOP 概念两个很重要角色:切点 和 拦截器。...切点:程序某个具体业务点(方法)。 拦截器:拦截器其实是一 Java 代码,用于拦截切点在执行前(或执行后),先运行这段 Java 代码。...编写 eBPF 程序多种方式,比如使用原生 eBPF 汇编来编写,但使用原生 eBPF 汇编编写程序难度较大,所以一般不建议。...为什么不能全部使用 Python 编写呢?这是因为 LLVM/Clang 只支持将 C 语言编译成 eBPF 字节码,而不支持将 Python 代码编译成 eBPF 字节码。...使用 C 编写 eBPF 程序 新建一个 hello.c 文件,并输入下面的内容: int hello_world(void *ctx) { bpf_trace_printk("Hello, World

2K20

汇编语言之GNU ARM

每种汇编器都可以自己伪指令集和自己语法 使用不同汇编汇编同一个cpu架构汇编代码,所对应指令绝对是一致,但伪指令各有千秋 ;使用ARM官方汇编器 AREA test, CODE...工具包 由于接下来我们选择安卓模拟器上进行开发学习,因此我们选择arm-none-linux-eabi这套工具来进行代码编译 工具下载 GCC工具具体使用 伪指令和伪操作 注释 声明 代码....text @代码 自定义一个 函数或者标签声明 数据声明 数据批量定义 格式如下: .rept @重复次数 @数据定义代码 .endr @结束重复定义 关于align 反汇编结果:...文件引用汇编函数,C文件只能使用extern伪指令: extern arm_strcpy(char *src,char*des); int main2(){ char *a="hello pangshu...b; } 第二步, 汇编文件引入函数,使用import或者extern伪指令 AREA code, CODE import c_sum mov R0,#1 ;第一个参数 mov R1,#2 ;

2.1K30

iOS开发你不知道事-编译&链接

0; } linux下只需要一个简单命令(假设源代码文件名为hello.c): $ gcc hello.c $ ....所以汇编汇编过程相对于编译器来讲比较简单,它没复杂语法,也没有语义,也不需要做指令优化,只是根据汇编指令和机器指令对照表一一翻译就可以了。...: gcc –c hello.c –o hello.o 链接(linking)   链接通常是一个让人比较费解过程,为什么汇编器不直接输出可执行文件而是输出一个目标文件呢?...下面让我们来看看怎么样调用ld才可以产生一个能够正常运行Hello World程序: 注意默认情况没有gcc / 记得 : $ brew install gcc 链接相应库 [1240] 下面贴出我们写出代码是如何变成目标代码流程图...: [1240] 主要通过我们编译器做了以下任务:扫描、语法分析、语义分析、源代码优化、代码生成和目标代码优化 到这我们就可以得到以下文件,不知道你是否和我一起操作,玩得感觉还是不错,继续往下面看

54400

关于跨平台一些认识

但是实际上,hello world编译过程是这样: ? 我们分阶段来讨论: 预处理阶段。预处理器(cpp)来把 代码#开头行进行展开, 比如头文件,宏等内容,修改最初C文件。 编译阶段。...一种汇编语言专用于某种计算机系统结构,而不像许多高级语言,可以不同系统平台之间移植。...他们所使用指令集不同啊, 这种芯片设计事情,又不像TCP/IP协议那样国际统一标准,甚至像intel所代表复杂指令集,和arm为代表精简指令集,它们指令集设计思路就是不一样。...也有些人会讲,为了让linux下编写hello程序运行在window上,我不拿最后编译结果hello来直接运行,我window环境下重新用IDE建立项目,同样代码window下重新运行一遍...部分商用虚拟机,Java程序最初是通过解释器(Interpreter)进行解释执行,当虚拟机发现某个方法或代码运行特别频繁时,就会把这些代码认定为“热点代码”(Hot Spot Code)。

51130

为 a.out 举行一个特殊告别仪式

gcc 默认生成 a.out 实际格式是 ELF: $ echo 'int main(void){ return 0; }' | gcc -x c - - $ file a.out a.out: ELF...,“Linux Lab” examples/assembly/x86 下提供了这样一个汇编程序。...,可以直接用标准 hello.c,也可以用汇编,这里直接复用上面的 examples/assembly/x86/x86-hello.s,把它复制到 Linux 0.11 磁盘,并稍作改动即可: $.../a.out Hello, world! 如果需要编辑,记得通过 mkdir /tmp 创建一个 /tmp 目录,然后就可以用 vi 直接在 Linux 0.11 编辑代码了。.../elf-hello,会出现错误,留待后续分解吧。 5. 小结 到这里为止,经过诸多努力,终于 a.out 彻底被从官方 Linux 剔除之前,完成了一次运行尝试。

1.2K30

Linux编译工具:gcc入门

所谓本地编译器,是指编译出来程序只能够本地环境进行运行。而gcc编译出来程序能够在其他平台进行运行。例如嵌入式程序可在x86上编译,然后arm上运行。...编译阶段,gcc调用不同语言编译器,例如c语言调用编译器ccl。gcc实际上是个工具链,在编译程序过程调用不同工具。汇编阶段,gcc调用汇编器进行汇编。...汇编生成是可重定位目标文件,学过操作系统,我们知道,源程序地址是从0开始,这是一个相对地址,而程序真正在内存运行时地址肯定不是从0开始,而且在编写源代码时候也不能知道程序绝对地址,....s -c 通知gcc取消连接步骤,即编译源码,并在最后生成目标文件 -Wall 使gcc对源文件代码问题地方发出警告 -Idir 将dir目录加入搜索头文件目录路径 -Ldir 将dir目录加入搜索库目录路径...-llib 连接lib库 -g 目标文件嵌入调试信息,以便gdb之类调试程序调试 现在我们有源文件hello.c,下面是一些gcc使用示例: gcc -E hello.c -o hello.i

4.7K50

GCC、ARM-LINUX-GCC、ARM-ELF-GCC浅析

【这个包GCC编译生成库,前辈们为了方便大家开发,就把Glibc放到GCC】 举例描述下上面3个包是如何进行运作。...一个c源文件test.c源码如下: #include int main(int argc, char *argv[]) { printf("Hello Linux!!...看到源码printf函数没有,这个函数GCC是以库函数形式存在,这个库函数glibc库stdio.h头文件中被声明。...例如,要使用交叉工具链为ARM机器编译简单Hello World程序,你可以运行如下所示命令: 使用如下命令编译并测试这个代码: $ arm-linux-gcc -o hello hello.c 五...包也不一样;glibc一个c库,最终是以库形式存在于编译器,自然ARM所使用glibc库跟X86同样也是不一样咯,其它依此类推。

6.5K10

程序基本概念

编写、编译和执行一个C程序步骤如下: 用文本编辑器写一个C程序,然后保存成一个文件,例如 program.c (通常C程序文件名后缀是 .c ),这称为源代码(Source Code)或源文件...,就是编译器把源代码分析一遍生成可执行文件,而之后可执行文件每次执行时就不需要再分析源代码了。...有些时候编译器提示信息不是 error 而是 warning ,例如把上例 printf("Hello, world....出警告信息说明你程序写得不够规范,可能有Bug,虽然能编译生成可执行文件,但程序运行结果往往是不正确,例如上面的程序运行时出了一个错误(Segmentation fault),错误是程序崩溃(...比如把上例 printf("Hello, world.\n"); 改成 printf(0); 然后编译运行: $ gcc main.c$ .

1.1K20

ShellcodeTemplate:一款针对WindowsShellcode模版工具

关于ShellcodeTemplate ShellcodeTemplate是一款易于修改针对Windows x64/x86Shellcode模版工具,该工具基于TitanLdr开发,能够帮助广大研究人员将项目代码编译成一个...Shellcode百科 Shellcode是一用于利用软件漏洞而执行代码,实际上是十六进制形式机器语言,大家知道机器语言是二进制,CPU只认识二进制,因为要被直接注入到内存,没办法编译了,所以希望...CPU可以执行,那就只能用机器代码了,一般用汇编语言写出程序,在从目标代码中提取出来。...------ Instance.Win32.MessageBoxA( NULL, GET_SYMBOL( "Hello World" ), GET_SYMBOL( "MessageBox Title..." ), MB_OK ); } 值得注意是,正如大家所看到那样,我们可以直接在我们Shellcode中使用常规字符串,这是因为我们链接时候向我们Shellcode引入了.rdata字段,

68840

二进制基础

做 pwn 或者 reverse 一些基础 程序编译与链接 编译:由 C 语言代码生成汇编代码 汇编:由汇编代码生成机器码 链接:将多个机器码目标文件链接成一个可执行文件 Linux 下可执行文件格式...静态存储区 code:静态存储区 堆空间从低地址向高地址增长 栈空间从高地址向低地址增长 和节: ·代码包含了代码和只读数据 .test节(用户代码实现)...磁盘上可执行文件要先到内存,才能被 CPU 执行 从程序变为虚拟内存 int glb; char* str = "Hello world"; int sum(int x, int y) {...) Bss: glb (存放未初始化全局变量)(不占用磁盘空间但是占用内存空间) Data: str (保存只读、不可写、不可执行数据) Text: main、sum、"Hello world!"...AT&T 汇编格式 Disp(base, index, scale) movq $0xffff, (%rsp) C 语言 数据类型 汇编代码后缀 char 字节 b byte short 字 w word

34840

物联网时代嵌入式开发平台

因为他们要卖东西,他们客户,大多数还使用裸机C开发,而不像系统级CPU那样完善开发平台支持。他们客户,迫切需要一个开发平台,来规避晦涩难懂硬件驱动开发,使应用和驱动相分离。...这并不是说,物联网时代嵌入式产品多复杂,非RTOS不可,可是,再过几年,裸机C编程,会像现在汇编编程那样,成为“高端技能”。...为什么呢?因为开发工具已经完成了大量工作,厂家固件,完成GPIO驱动,IDE自动生成代码,完成了main函数之前大量环境初始化工作。...所以,你只需要3分钟,main函数里放一个循环改变GPIO状态代码,一个C语言闪灯程序就完成了。事实上,如果从0开始做,汇编完成闪灯,不知比C简单多少倍。...裸机C取代汇编语言过程,正在裸机C和RTOS编程之间重演着,不信么?我出个“简单”题,写一个“hello world嵌入式程序看看。

4.4K111

VS中使用X64汇编

需要注意是,X86项目中,可以使用__asm{}来嵌入汇编代码,但是X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门.asm汇编文件来编写相应汇编代码,然后在其它地方来调用这些汇编代码...那么,如何在VS中使用X64汇编呢?本例子将演示如何在汇编文件中使用.c或者.cpp源文件定义函数和变量,以及如何在.c或者.cpp中使用汇编文件定义函数。...#include "stdafx.h" #include "func.h" void print1(void) { printf("hello world1\n"); } void print2...(void) { printf("hello world2\n"); } //func.h #pragma once extern "C"//防止函数被name mangling { void...;自己定义变量 .CODE func1 PROC mov r10, g_iValue;使用func.h外部变量 mov val1,r10;使用自定义变量 mov rax,val1 ret;如果不返回

3.6K31

初识Go语言

但是,当想看某一行代码汇编级是怎么执行时(这是从C语言时代就养成习惯,一般写一行C语法,基本上都能预测出生成非优化汇编代码), 我发现代码到处充斥着Go插入代码,让代码可读性差很多。...这就意味着,即使我能突破编译器插入代码这个障碍,我依然看不到最终执行X86指令,我依然不知道代码最终CPU上是如何执行。...按照我X86汇编经验,在编译器优化阶段,总是尽可能将栈上变量,优化到寄存器上去,甚至前几个参数都是通过寄存器来传递。 来随便看简单C代码和相应汇编。...我很难确定,是不是Plan9ABI,每个函数只有三个寄存器可用。 在从Plan9生成X86汇编时,会把栈上变量尽可能多地转移到x86寄存器上。...并发属于代码;井行属于一个运行程序这句话似乎隐隐告诉我:不要害怕CSP导致并行度下降,只要你开足够多goroutine,并行度在运行时很快就上去了,这也是为什么Go语言一直不停鼓励我们写并发结构程序原因

35910

gcc编译过程

五、编译 编译程序所要作工作就是通过词法分析和语法分析,确认所有的指令都符合语法规则之后,将其翻译成等价中间代码表示或汇编代码。...gcc -S hello.i -o hello.s 不同编译器交叉编译同一个 hello.i 文件生成汇编文件也不相同,这也是 C 语言可移植性一种体现。...六、汇编 汇编过程实际上指把汇编语言代码翻译成目标机器指令过程。对于被翻译系统处理每一个 C 语言源程序,都将最终经过这一处理而得到相应目标文件。...目标文件中所存放也就是与源程序等效目标的机器语言代码。 目标文件由组成。通常一个目标文件至少有两个代码(文本段):该段中所包含主要是程序指令。...七、链接 汇编程序生成目标文件并不能立即就被执行,其中可能还有许多没有解决问题。

21910
领券