c语言汇编

C与汇编语言 目录 一、汇编指令 二、汇编器和链接器 三、 汇编语法 四、C中嵌入汇编代码 五、GDB反汇编 1、x86_64通用寄存器 2、 调用栈 3、导出汇编代码 4、反汇编调试详解 5、结构体反汇编 一、汇编指令 汇编指令是指特定CPU架构的指令码的助记符,比如Intel x86 32位下ADD指令对应的16进制机器码有04/05/80/81等,被操作对象不同同一个... 阅读详情
int main() {
    
short x=6;
    
short y=9;
    
short z;

    z 
= x+y;
        
return 0;
}

    .file    "CSCILab03-1.cpp"
; This 
is the input source file.  This will probably make it into the
; assembler output 
as some kind of debug record for later debugging.

    .text
    .align 
2
; .text 
is a section command (.data and .bss are others).  All program
; and constant data typically goes into .text.  Global initialised data
; should be 
in .data, and uninitialised globals should be in .bss

.globl main
    .type    main, @function
; Declare a 
global symbol, and set it's type to be a function.

main:
; main starts here :)

    leal    
4(%esp), %ecx       ; Save the original stack pointer
    andl    $
-16, %esp          ; -16 is 0xFFFFFFF0, which clears the bottom
                                ; 
4 bits of the stack pointer (esp).  The effect
                                ; of 
this is to ensure the stack remains 16-byte
                                ; aligned 
for the most efficient access to any
                                ; data type;
    pushl   
-4(%ecx)            ; push the original stack pointer
    ; These first 
3 instructions are only something you will see in main()
    ; Put the same code into another function, and it will just begin with
    ; the saving and setting up of ebp.

    pushl   
%ebp                ; Save original base pointer (ebp)
    movl    
%esp, %ebp          ; Establish a new base pointer where the stack is now.
    pushl   
%ecx                ; Save it
    subl    $
16, %esp           ; Allocate some space for local variables.

    movw    $
6, -10(%ebp)       ; short x=6;
    movw    $
9, -8(%ebp)        ; short y=9;
    movzwl  
-10(%ebp), %edx     ; Move (short)x into edx, and clear the MSW
    movzwl  
-8(%ebp), %eax      ; Move (short)y into eax, and clear the MSW
    leal    (
%edx,%eax), %eax   ; one of many ways of performing an addition.
    movw    
%ax, -6(%ebp)       ; Move (short)ax into z

    movl    $
0, %eax            ; return 0; (well, putting 0 into the return register)

    addl    $
16, %esp           ; remove the local variables
    popl    
%ecx                ; restore a register
    popl    
%ebp                ; restore another register

    leal    
-4(%ecx), %esp      ; restore the original stack pointer
                                ; 
this is another 'main only' step, see the start

    ret                         ; Adiós amigo

.LFE2:
    .size    main, .
-main
; Some 
internal symbol which indicates how many bytes the main function
; occupies.

.globl __gxx_personality_v0
; gxx_personality 
is something which g++ emits, for what, I don't know.

    .ident    
"GCC: (GNU) 4.1.1 20070105 (Red Hat 4.1.1-52)"
; More identification of what generated 
this assembly code.

    .section    .note.GNU
-stack,"",@progbits
; Dunno what 
this is for.

.file 
"CSCILab03-1.cpp" ; This is the input source file. This will probably make it into the ; assembler output as some kind of debug record for later debugging. .text .align 2 ; .text is a section command (.data and .bss are others). All program ; and constant data typically goes into .text. Global initialised data ; should be in .data, and uninitialised globals should be in .bss .globl main .type main, @function ; Declare a global symbol, and set it's type to be a function. main: ; main starts here :) leal 4(%esp), %ecx ; Save the original stack pointer andl $-16, %esp ; -16 is 0xFFFFFFF0, which clears the bottom ; 4 bits of the stack pointer (esp). The effect ; of this is to ensure the stack remains 16-byte ; aligned for the most efficient access to any ; data type; pushl -4(%ecx) ; push the original stack pointer ; These first 3 instructions are only something you will see in main() ; Put the same code into another function, and it will just begin with ; the saving and setting up of ebp. pushl %ebp ; Save original base pointer (ebp) movl %esp, %ebp ; Establish a new base pointer where the stack is now. pushl %ecx ; Save it subl $16, %esp ; Allocate some space for local variables. movw $6, -10(%ebp) ; short x=6; movw $9, -8(%ebp) ; short y=9; movzwl -10(%ebp), %edx ; Move (short)x into edx, and clear the MSW movzwl -8(%ebp), %eax ; Move (short)y into eax, and clear the MSW leal (%edx,%eax), %eax ; one of many ways of performing an addition. movw %ax, -6(%ebp) ; Move (short)ax into z movl $0, %eax ; return 0; (well, putting 0 into the return register) addl $16, %esp ; remove the local variables popl %ecx ; restore a register popl %ebp ; restore another register leal -4(%ecx), %esp ; restore the original stack pointer ; this is another 'main only' step, see the start ret ; Adiós amigo .LFE2: .size main, .-main ; Some internal symbol which indicates how many bytes the main function ; occupies. .globl __gxx_personality_v0 ; gxx_personality is something which g++ emits, for what, I don't know. .ident "GCC: (GNU) 4.1.1 20070105 (Red Hat 4.1.1-52)" ; More identification of what generated this assembly code. .section .note.GNU-stack,"",@progbits ; Dunno what this is for.

The 
%ebp is the base pointer, also known as the stack frame pointer. It is a fixed register within the scope of a single function.
All local variables (a negative offset) and parameters (a positive offset) are accessed relative to the 
%ebp established at the start of the function.

Since 
4(%ebp) is the previous frame pointer, you can use this (as debuggers do) to walk up the stack to examine the state of any function in the current call hierarchy. The 'bt' command in GDB will use this chain for example.
 
【408篇】C语言笔记-第二十一章(汇编语言) CPU是如何执行我们的程序的?我们编译后的可执行程序,也就是main.exe,是放在代码段的,PC指针寄存器存储了一个指针,始终指向要执行的指令,读取了代码段的某一条指令后,会交给译码器来解析,这时候译码器就知道要做什么事了,CPU中的计算单元,加法器不能直接对栈上的某个变量a,直接做加1的操作,需要首先将栈,也就是内存上的数据,加载到寄存器中,然后再利用加法器加1操作,在从寄存器搬到内存上去。CPU读写寄存器的速度比读写内存的速度要快很多。操作码字段:表征指令的操作特征与功能(指令的唯一标识),不同的指令 阅读详情

相关推荐

(详细教程)opencv+pycharm+笔记本摄像头 做一个人脸识别

文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 一、安装opencv-python 这里推荐使用pycharm直接安装opencv-python 打开文件——设置——python解释器——点击+号 搜索opencv-python,点击安装包,等待片刻即可安装好 检查是否安装好,新建一个项目输入以下代码,若无报错则安装好 import cv2 二、准备分类器 咱们使用opencv官方提供的分类器,包括面部识别,侧...

qq_52852432的博客 1万+

C语言-汇编的学习

C语言-汇编的学习 简单汇编的使用,深入剖析下面几句代码蕴含的知识 下面几句对于单片机来说是怎么执行的呢: 1、C语言代码会变成汇编指令存在Flash里面 2、CPU去Flash里面取指令,然后一条条执行 ...

会选科技的博客 1233

西门子V90 PN伺服控制核心:FB284功能块详解与实战

在工业自动化中,伺服定位控制是运动控制的基础环节,其本质是PLC通过PROFINET协议与伺服驱动器实现高速、确定性数据交互。FB284作为西门子为V90 PN定制的标准化功能块,封装了GSD映射、状态机管理与周期性PDO同步机制,将底层寄存器操作抽象为高可靠调用接口。相比MOVE指令或MC_MoveAbsolute等通用方案,FB284显著降低时序错乱风险,提升多轴同步精度与故障响应能力。它广泛应用于包装、灌装、装配等中端产线,尤其适配S7-1200/1500平台下的快速部署与现场维护。本文聚焦V90 P

weixin_42696271的博客 300

从C语言到汇编(三)if语句

if 从最简单的if语句开始。 #include <stdio.h> int main(void) { int a; scanf("%d",&a); if((a&1)==0) { printf("is even!"); } return 0; } 最简单的if语句如上。我们将其转化为汇编。 .section .rodata .LC0:.strin...

pk_20140716的专栏 908

Selenium ChromeDriver反爬与性能优化实战指南

ChromeDriver作为Selenium的核心驱动,本质是浏览器自动化执行引擎,其默认行为会暴露大量JS运行时指纹(如navigator.webdriver、window.chrome),极易被前端反爬系统识别;同时因进程管理粗放、渲染等待机制僵化,导致内存泄漏、僵尸进程和高并发下稳定性崩塌。本文围绕真实生产场景,系统解析浏览器指纹伪造原理、进程级资源管控策略、基于页面状态的智能等待范式,并提供Docker容器化、K8s弹性扩缩与Prometheus可观测性落地路径,助力开发者将ChromeDriver

weixin_29762151的博客 1259

从零到一:DAMASK与ABAQUS联合仿真的环境配置艺术

本文详细介绍了在Ubuntu 16.04系统中配置DAMASK与ABAQUS2017联合仿真环境的完整流程,涵盖系统基础环境搭建、Python科学计算环境构建、DAMASK核心安装与配置,以及ABAQUS集成与联合调试。通过实战案例和高级调试技巧,帮助用户快速掌握有限元分析中的晶体塑性模拟技术。

weixin_29253711的博客 858

计算机基础知识(1)——汇编语言基础入门(C语言转汇编方法)

汇编语言的基础知识

MilesXue的博客 1848

2024.6.10丨基于DIAMOND与VFDB数据库的致病菌毒力因子高效注释指南

本文详细介绍了基于DIAMOND与VFDB数据库的致病菌毒力因子高效注释方法,涵盖工具安装、参数优化、数据库选择及实战案例解析。通过DIAMOND的快速比对和VFDB的全面毒力因子数据,显著提升微生物基因组研究效率,适用于临床检测、食品安全监测等多个场景。

weixin_33712987的博客 376

汇编 c语言对应_C语言及汇编语言解析

什么是c语言:C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言;尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。什么是汇编语言:汇编语言(a...

weixin_39841709的博客 1789

【Mode Management】AUTOSAR架构下RH850-F1KM芯片深度休眠配置实践

AUTOSAR架构下RH850-F1KM芯片深度休眠配置实践

qq_36056498的博客 1091

37、半导体硅材料中的缺陷与吸杂技术解析

本文系统解析了半导体硅材料中的缺陷形成机制及其对电子器件性能的影响,重点探讨了生长和工艺诱导缺陷、表面与内部微缺陷的起源与特征。文章详细阐述了吸杂技术的原理、过程及在集成电路和太阳能电池制造中的应用,强调通过氧行为调控和热处理优化实现缺陷控制。同时介绍了吸杂效果的评估方法,并展望了未来新型吸杂技术的发展趋势,为提升半导体器件性能和制造良率提供理论支持和技术路径。

mongodb5scout的博客 164

如何在C语言中嵌入汇编

C语言怎样嵌入汇编: TIPS:在编译过程汇中,汇编代码块是原封不动地送到汇编语言编译阶段的。一、为什么会用到汇编? 1.为了提高速度和效率。不过这种情况很少了,现在C/C++编译器的优化很厉害了。 2.为了实现某些C语言中不具备、但为不同的机器所特有的功能。这是主要原因。 3.为了利用通用的汇编语言例程。也常会遇到。二、何时使用汇编? 第一种情况是,绝对没有其他方法可以使用。 第二种情况出现在某个C语言程序的执行时间必须减少的时候。三、如何嵌入汇编?【Turbo C】: 1.使用预处理程序的伪指令#a.

qfturauyls的博客 8245

【2025年阿里云暑期实习(算法岗)-4月24日-第一题(100分)- 小红听歌】(题目+思路+Java&C++&Python解析+在线测试)

小红正在听歌,屏幕上同时展示着歌词和对应的播放进度条。s1t101ti​0iti​1i小红每次可以操作快进或回退一个歌词(即将播放指针向右或向左移动一个位置),数据初始时和操作过程均保证已经播放的歌词是s的一个前缀(可为空串)。她的目标是:以尽可能少的操作次数,使得字符串s中未播放状态的歌词是"幸运串"。请你计算,为了达到该目标,至少需要多少次操作?(数据保证可以在有限次内完成操作目标)【幸运串】每种字母出现的次数为指定的次数,可为空串,具体可查看输入描述。

m0_73659489的博客 114

C语言中嵌入汇编

在阅读Linux内核源码或对代码做性能优化时,经常会有在C语言中嵌入一段汇编代码的需求,这种嵌入汇编在CS术语上叫做inline assembly。本文的笔记试图说明Inline Assembly的基本语法规则和用法(建议英文阅读能力较强的同学直接阅读本文参考资料中推荐的技术文章 _)。 注意:由于gcc采用AT&T风格的汇编语法(与Intel Syntax相对应,二者的区别参见这里),因...

xiaozi0221的博客 1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C语言和汇编语言相互调用

C语言和汇编语言相互调用 不同的语言就像一座孤岛,似乎毫不相干,但是所有的代码最终都要编译成机器指令,他们本质上也是一样的,最终都是变成指令给CPU下达命令。 1. C语言的链接过程 我们知道一个C语言源文件变成可执行文件,需要经过一下几个步骤: 预处理。(hello.c -> hello.i)把头文件包含起来。 编译。(hello.i -> hello.s)编译成汇编代码。 汇编。(hello.s -> hello.o)生成目标文件。 链接。(hello.o ->

m0_55708805的博客 1万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

汇编语言定义变量c,汇编c语言变量

广告Apple iPad,AirPods Pro,Bose耳机,机械键盘,健身环等着您由于c ++支持重载,因此可以使用相同的函数名称但不同的参数类型定义函数. 在编译期间,编译器根据函数的参数类型确定实际的函数名称(或汇编语言中的函数名称). 与c不同,此命名规则更加复杂. 它仅在变量名称和函数名称之前添加下划线. 因此,在c文件中定义了名为name的全局变量或函数,并在cpp文件中定义了......

weixin_34112399的博客 2804

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

c语言和汇编语言的区别

什么是c语言:     C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言;尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。

wp1995的博客 2万+

C语言进阶——内联汇编

内联函数 在 C 语言中,我们可以指定编译器将一个函数代码直接复制到调用其代码的地方执行。这种函数调用方式和默认压栈调用方式不同,我们称这种函数为内联函数。有点像宏。 优点:内联函数降低了函数的调用开销。 实现:指定编译器将一个函数处理为内联函数,我们只要在函数声明前加上 inline 关键字就可以了。 内联汇编 基于对上述内联函数的认知,我们大概可以想象出内联汇编到底是怎么一回事了。内联汇编相当于用汇编语句写成的内联函数。 优点:效率高。 实现:使用 asm 关键字。 关键:之所以内联汇编如此有用,主要

lyndon 3万+

C语言与汇编语言的区别

如果你做得程序比较小几k而已,用汇编代码程度会比c小点,应为你可以规划的很清楚,但是如果你的程序稍微大一些那么c的优势就体现出来了,开发速度比汇编快了多得多,代码长度也不错(因为你无法规划到最最优化),维护修改比汇编容易得多(恐怕没有那个项目老板的要求不会改吧?),一般的实时性没有问题,真的要求时间非常精确也可以嵌入汇编(以前做cpu卡,7816-3的标准,就用汇编做最底层单字节读写然后用c主程序

1万+

c语言中嵌入汇编语言,C语言中嵌入汇编

1、在 C 文件中要嵌入汇编代码片以如下方式加入汇编代码:#pragma ASM; Assembler Code Here#pragma ENDASM2、在 Project 窗口中包含汇编代码的 C 文件上右键,选择“Options for ...”,点击右边的“Generate Assembler SRC File”和“Assemble SRC File”,使检查框由灰色变成黑色(有效)状态;3...

weixin_30164615的博客 4200

C语言内联汇编

内联汇编是指代在C/C++中嵌入的汇编代码,不需要额外的外部调用的操作,可以直接嵌入使用。常见的两种内联汇编格式有:GCC内联汇编、VC内联汇编。

qq_43390703的博客 2040

c语言可以调用汇编语言吗,C语言与汇编语言混编方式

C语言是目前非常流行的一种编程语言,除具有高级语言使用方便灵活、数据处理能力强、编程简单等优点外:还可实现汇编语言的大部分功能,如可直接对硬件进行操作、生成的目标代码质量较高等,而汇编语言没有高级语言要占用较大的存储空间和较长的运行时间等缺点,它的运行速度快是高级语言所不能比拟的,可以说高级语言与汇编语言各有千秋。目前c语言与汇编语言的混合编程在诸如对硬件的直接操作、中断处理、快速执行等场合有着广...

weixin_39692623的博客 1311

【ARM】 《C 语言调用汇编子程序》 与 《汇编调用 C 语言程序》

题目: 实现计算 1+2+3+…+(N−1)+N1+2+3+…+(N-1)+N1+2+3+…+(N−1)+N 的值 (N&gt;0)(N&gt;0)(N>0) 的加法运算 在 C 语言程序中调用汇编子程序,汇编子程序实现两个数的加法运算 在汇编程序中调用 C 语言子程序,C 语言子程序实现两个数的加法运算 一、 C 语言调用汇编子程序 C 语言主程序 #define ui...

Krone_的博客 2579

从C语言到汇编,从汇编到C语言

<br /><br />看雪一同志写的文章,我觉得很基础和有用,知识着眼于小处。积累才是王道!<br />一、循环语句与发汇编后的机器语言<br />1、for循环<br />   下面是一段C语言的代码,我们的目的是来看其反汇编的结果:<br />   int myfunction(int a,int b) <br />    { <br />         int c = a+b; <br />         int i; <br />         for(i=0;i<50;i++) <br /

oathevil的专栏 1427

与汇编语言相比c语言,汇编语言与C语言有什么区别

1、操作复杂程度的不同c语言,与汇编语言相比,c语言在更加接近人的一般思维,因此在程序的设计过程中比较容易操作,此外在进行一些复杂的操作,运算时,c语言比汇编就要简单很多,尤其是c语言中的丰富的函数库,可以直接实现一些原本很复杂的功能,并且从代码量来说任意一个c语言程序,通过反汇编之后变成汇编语言程序,其长度都可能要增加好几倍。2、使用范围的不同c语言程序的事件将会只是编写汇编语言程序的几分之一,...

weixin_32938207的博客 4620

ARM汇编1:如何在C语言中使用汇编

我最近对ARM的NEON编程有兴趣,主要是为了想学习一些矩阵计算加速相关的知识。但是我又不想写纯粹的汇编语言,我想在C语言中嵌入汇编来使用。 经过检索学习,我找到两种可行的方式。我在阅读ncnn代码的时候,发现下面这两种方式都有用到。为了后续能愉快的阅读ncnn代码,将相关知识做个简单的整理。

yuanlulu的博客 1756
上一篇: 书写Linux下自己的shellcode
下一篇: c语言控制语句对应的汇编语句代码
mindview
博客等级 码龄19年 7粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值