汇编语言学习(2)

更好的阅读体验,请点击 YinKai’s Blog。

基本语法

汇编程序可以分为三个部分:

  • 数据部分(data section)
  • 未初始化数据部分(bss section)
  • 文本部分(text section)
data 部分

​ 数据部分通常用于存储程序中需要初始化的数据。这可以包括常量、变量和其他静态数据。这个部分的数据在程序运行之前被初始化,并且在整个程序的执行过程中保持不变。

​ 声明数据部分的语法如下:

section .data
bss 部分

​ 未初始化数据部分用于存储程序中未初始化的全局和静态变量。与数据部分不同,bss 部分的变量在程序加载时不会被初始化,而是在运行时由系统初始化为零或空值。这样可以节省可执行文件的大小,因为在文件中只需要记录这些变量的名称和大小,而不需要存储它们的实际值。

​ 声明 bss 部分的语法如下:

section .bss
text 部分

​ 文本部分包含程序的实际代码。这是程序的主要执行部分,包括机器指令和指令的地址。在这个部分,汇编程序将源代码翻译成机器可执行的指令,使得计算机能够按照特定的算法执行相应的操作。

​ 声明 文本部分的语法如下:

section .text
注释

​ 汇编语言中的注释以分号;开头。注释可以独立一行存在,也可以与指令在同一行。例如:

; This is a line of comments
add eax, ebx ; adds ebx to eax
汇编语言语句

​ 汇编语言程序由三种类型的语句组成:

  • 可执行指令:告诉处理器要执行的操作,每条指令包括操作码和操作数
  • **汇编器指令或伪操作:**用于影响汇编过程的方面,它们不会生成机器语言指令
  • **宏:**一种文本替换机制
汇编语言语句的语法

​ 汇编语言语句每行输入一个语句,每个语句都遵循以下格式:

[label]    mnemonic    [operands]    [;comment]

​ 方括号中的字段是可选的。

​ 基本指令由两部分组成,第一部分是哟啊执行的指令名词(或助记符),第二部分是命令的操作数或参数。

​ 以下是一些典型汇编语言语句的示例:

  1. MOV指令(数据传送):

    MOV AX, 42       ; 将值42存储到寄存器AX中
    MOV BX, AX       ; 将寄存器AX的值传送到寄存器BX中
    
  2. ADD和SUB指令(加法和减法):

    ADD AX, BX       ; 将寄存器AX和BX中的值相加,并将结果存储在AX中
    SUB CX, 10       ; 从寄存器CX中减去值10,并将结果存储在CX中
    
  3. CMP和JMP指令(比较和跳转):

    CMP AX, BX       ; 比较寄存器AX和BX的值
    JE  label        ; 如果相等,则跳转到标签label处
    JG  another_label ; 如果大于,则跳转到另一个标签another_label处
    JL  target_label         ; 如果小于,跳转到目标标签
    
  4. INC和DEC指令(递增和递减):

    INC SI           ; 将寄存器SI中的值递增1
    DEC CX           ; 将寄存器CX中的值递减1
    
  5. LOOP指令(循环):

    MOV CX, 5        ; 设置循环计数器CX的初始值为5
    loop_start:      ; 循环开始标签; 循环体代码DEC CX        ; 循环计数器递减1 JNZ loop_start; 如果计数器不为零,则跳转到循环开始标签
    
汇编中的 Hello World 程序
section .datamsg db 'Hello, world!', 0xa  ; 要打印的字符串,0xa 是换行符len equ $ - msg     ; 字符串的长度section .textglobal _start     ; 必须为链接器(ld)声明的全局入口点_start:             ; 告诉链接器入口点; write message to stdoutmov eax, 4       ; 系统调用号(sys_write)mov ebx, 1       ; 文件描述符(标准输出)mov ecx, msg     ; 要写入的消息mov edx, len     ; 消息的长度int 0x80         ; 调用内核; exit the programmov eax, 1       ; 系统调用号(sys_exit)xor ebx, ebx     ; 返回码为0int 0x80         ; 调用内核

上面的代码被编译并执行后,会输出如下内容:

Hello, world!
在 NASM 中编译和链接汇编程序

​ 为了能让上面的程序运行起来,我们需要按下面的步骤编译和链接上述程序:

  1. 使用文本编译器输入上述代码并将其保存为 hello.asm,后续的操作都在该目录下进行
  2. 输入 nasm -f elf hello.asm 编译汇编程序
    • -f elf:这是 NASM 的一个选项,用于指定生成的目标文件的格式。在这里,elf 表示目标文件将采用 ELF(Executable and Linkable Format)格式。
    • ELF 是一种通用的二进制文件格式,用于可执行文件、目标文件和共享库。
  3. 如果程序没有问题,就会程序名为 hello.o 的程序目标文件
  4. 输入 ld -m elf_i386 -s -o hello hello.o 命令,链接目标文件并创建名为 hello 的可执行文件
    • ld: 这是链接器的命令。链接器的作用是将多个目标文件链接在一起,解析符号引用,生成最终的可执行文件。在执行该命令时,链接器会将系统库和其他必要运行时库链接到目标文件 hello.o 中。我们的代码中由于程序只是在标准输出上打印一条消息,因此系统库中的一些 I/O 相关的函数可能被链接进来,以便程序能够正确地执行。
    • -m elf_i386: 这个选项告诉链接器使用 ELF (Executable and Linkable Format) 文件格式,并且生成 32 位 x86 架构的可执行文件。elf_i386 表示生成的可执行文件是面向 32 位 x86 架构的 ELF 文件。
    • -s: 这个选项用于剥离(strip)可执行文件中的符号表信息。符号表包含了程序中定义的各种符号(如变量、函数名等)的信息。在生产环境中,剥离符号表可以减小可执行文件的大小,但同时也会使得可执行文件不易调试。
    • -o hello: 这个选项指定生成的可执行文件的输出名称为 hello-o 是指定输出文件的选项,后面跟着输出文件的名称。
    • hello.o: 这是输入的目标文件,它是由 NASM 编译器生成的,包含了汇编代码的机器代码。
  5. 最后通过 ./hello 执行程序

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/231009.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微服务——服务异步通讯(MQ高级)

MQ的一些常见问题 消息可靠性 生产者消息确认 返回ack,怎么感觉这么像某个tcp的3次握手。 使用资料提供的案例工程. 在图形化界面创建一个simple.queue的队列,虚拟机要和配置文件里面的一样。 SpringAMQP实现生产者确认 AMQP里面支持多种生产者确认的类…

【华为】文档中命令行约定格式规范(命令行格式规范、命令行行为规范、命令行参数格式、命令行规范)

文章目录 命令行约定格式**粗体&#xff1a;命令行关键字***斜体&#xff1a;命令行参数*[ ]&#xff1a;可选配置{ x | y | ... } 和 [ x | y | ... ]&#xff1a;选项{ x | y | ... }* 和 [ x | y | ... ]*&#xff1a;多选项&<1-n>&#xff1a;重复参数#&#xff…

xtu oj 1375 Fabonacci

题目描述 小明非常喜欢Fibonacci数列&#xff0c;数列为 f11,f22,fnfn−1fn−2。 小明想知道对于一个整数n&#xff0c;使得nfifjfk的组合有多少种&#xff1f; 比如5113 或者 5122,有2种。注意 122 和 212 被认为是同一种。 输入 第一行是一个整数T(1≤T≤1000)&#xff0c…

kill编译异常处理

当kill编译时出现如下警告 Build target Target 1 linking... *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESSSEGMENT: ?PR?_LCD_SHOWCHAR?LCD1602 *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESSSEGMENT: ?PR?_LCD_SHOWSTRING?LCD…

SpringSecurity 手机号登录

一、工作流程 1.向手机发送验证码&#xff0c;第三方短信发送平台&#xff0c;如阿里云短信。 2.手机获取验证码后&#xff0c;在表单中输入验证码。 3.使用自定义过滤器​SmsCodeValidateFilter​。 4.短信校验通过后&#xff0c;使用自定义手机认证过滤器​SmsCodeAuthentic…

【并发编程】线程基础

目录 1、线程基础 1.1基本概念 1.1.1 进程与线程 1.1.1.2 什么是线程 1.1.1.3 两者间的联系和区别 1.1.2 多线程 1.1.2.1 什么是多线程 1.1.2.2 多线程的局限 1.1.3串行,并行,并发 1.1.3.1 什么是串行 1.1.3.2 什么是并行 1.1.3.3 什么是并发 1.1.3.4 区别和联系…

UE4/UE5 日志插件(基于spdlog)

1 解决问题 对于高频日志序列化到本地的需求&#xff0c;spdlog肯定完美满足。 源码地址&#xff1a;https://github.com/gabime/spdlog 博主下载的版本为 spdlog-1.12.0&#xff0c;各位大佬可以根绝自己爱好选择。 2 过程介绍 大概目录&#xff1a; SpdlogLibC目录下是对…

Qt/C++音视频开发60-坐标拾取/按下鼠标获取矩形区域/转换到视频源真实坐标

一、前言 通过在通道画面上拾取鼠标按下的坐标&#xff0c;然后鼠标移动&#xff0c;直到松开&#xff0c;根据松开的坐标和按下的坐标&#xff0c;绘制一个矩形区域&#xff0c;作为热点或者需要电子放大的区域&#xff0c;拿到这个坐标区域&#xff0c;用途非常多&#xff0…

C语言之文件操作(下)

C语言之文件操作&#xff08;下&#xff09; 文章目录 C语言之文件操作&#xff08;下&#xff09;1. 文件的顺序读写1.1 文件的顺序读写函数1.1.1 字符输入/输出函数&#xff08;fgetc/fputc&#xff09;1.1.2 ⽂本⾏输⼊/输出函数&#xff08;fgets/fputs&#xff09;1.1.3 格…

工业应用新典范,飞凌嵌入式FET-D9360-C核心板发布!

来源&#xff1a;飞凌嵌入式官网 当前新一轮科技革命和产业变革突飞猛进&#xff0c;工业领域对高性能、高可靠性、高稳定性的计算需求也在日益增长。为了更好地满足这一需求&#xff0c;飞凌嵌入式与芯驰科技&#xff08;SemiDrive&#xff09;强强联合&#xff0c;基于芯驰D9…

vue3.0基础

1. setup函数 vue单页面使用到的变量和方法都定义在setup函数中,return后才能被页面引用 export default {setup(){const name 张三const person {name,age:30}function goWork(){consle.log(工作)}return {name,person,goWork}} } 注意&#xff1a;直接定义的变量修改不会…

SI24R03国产自主可控RISC-V架构MCU低功耗2.4GHz收发芯片SoC

目录 RISC-V架构的优势SI24R03/04特性射频收发器模块特征MCU 模块特征 其他特征 RISC-V架构的优势 相对于目前主流的英特尔X86架构及ARM等架构来说&#xff0c;RISC-V架构具有指令精简、模块化、可扩展、开源、免费等优点。RISC-V的基础指令集只有40多条&#xff0c;加上其他基…

Kafka--从Zookeeper数据理解Kafka集群工作机制

从Zookeeper数据理解Kafka集群工作机制 这一部分主要是理解Kafka的服务端重要原理。但是Kafka为了保证高吞吐&#xff0c;高性能&#xff0c;高可扩展的三高架构&#xff0c;很多具体设计都是相当复杂的。如果直接跳进去学习研究&#xff0c;很快就会晕头转向。所以&#xff0c…

Echarts相关配置

title&#xff1a;标题组件 tooltip:提示框组件 legend:图例组件 toolbox:工具栏 grid&#xff1a;直角坐标系内绘图网格 xAxis:直角坐标系grid中的x轴 yAxis&#xff1a;直角坐标系grid中的y轴 series:系列列表。每个系列通过type决定自己的图表类型 color&#xff1a;调色…

如何用 Cargo 管理 Rust 工程系列 戊

以下内容为本人的学习笔记&#xff0c;如需要转载&#xff0c;请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/-OiWtUCUc3FmKIGMBEYfHQ 单元和集成测试 Rust 为单元测试提供了非常好的原生支持。 创建库工程时&#xff0c;cargo 生成的源码文件 lib.rs 自带…

【C语言】自定义类型——枚举、联合体

引言 对枚举、联合体进行介绍&#xff0c;包括枚举的声明、枚举的优点&#xff0c;联合体的声明、联合体的大小。 ✨ 猪巴戒&#xff1a;个人主页✨ 所属专栏&#xff1a;《C语言进阶》 &#x1f388;跟着猪巴戒&#xff0c;一起学习C语言&#x1f388; 目录 引言 枚举 枚举…

网络连接和协议

网络连接是通过一系列协议来实现的&#xff0c;其中TCP/IP协议和HTTP协议是其中两个关键的协议。 1. **TCP/IP协议&#xff1a;** - TCP/IP&#xff08;Transmission Control Protocol/Internet Protocol&#xff09;是一组用于在互联网上传输数据的协议。它是一个层次化的…

06. Python模块

目录 1、前言 2、什么是模块 3、Python标准库模块 3.1、os模块 3.2、datetime 模块 3.3、random模块 4、自定义模块 4.1、创建和使用 4.2、模块命名空间 4.3、作用域 5、安装第三方依赖 5.1、使用 pip 安装单个依赖 5.2、从 requirements.txt 安装依赖 5.3、安装指…

【matlab】MATLAB 中的标量运算及实例

MATLAB 中的标量运算及实例 引言 在 MATLAB 中&#xff0c;标量是指只包含单个数值的变量或常量。尽管标量运算可能看似简单&#xff0c;但它在数值计算、数据处理和算法设计中扮演着重要的角色。本文将深入探讨 MATLAB 中的标量运算&#xff0c;介绍其基本操作和一些实例应用…

还在为学MyBatis发愁?史上最全,一篇文章带你学习MyBatis

文章目录 前言一、&#x1f4d6;MyBatis简介1.Mybatis历史2.MyBatis特性3.对比&#xff08;其他持久化层技术&#xff09; 二、&#x1f4e3;搭建MyBatis1.开发环境2.创建maven工程3.创建MyBatis核心配置文件4.创建mapper接口5.创建MyBatis的映射文件6.通过junit测试功能7.加入…