汇编语言和本地代码及通过编译器输出汇编语言的源代码

article/2025/10/13 5:13:43

CSDN话题挑战赛第2期
参赛话题:学习笔记

目录

一、汇编语言和本地代码

二、通过编译器输出汇编语言的源代码


一、汇编语言和本地代码

        计算机CPU只能运行本地代码(机器语言)程序,用C语言等高级语言编写的代码,需要经过编译器编译后,转换为本地代码才能够被CPU解释执行

        但是本地代码的可读性非常差,所以需要使用一种能够直接读懂的语言来替换本地代码,那就是在各本地代码中,附带上表示其功能的英文缩写,比如在加法运算的本地代码加上 add(addition)的缩写、在比较运算符的本地代码中加上 cmp(compare)的缩写等,这些通过缩写来表示具体本地代码指令的标志称为 助记符,使用助记符的语言称为 汇编语言。这样,通过阅读汇编语言,也能够了解本地代码的含义了

        不过,即使是使用汇编语言编写的源代码,最终也必须要转换为本地代码才能够运行,负责做这项工作的程序称为 编译器,转换的这个过程称为 汇编。在将源代码转换为本地代码这个功能方面,汇编器和编译器是同样的

        用汇编语言编写的源代码和本地代码是一一对应的。因而,本地代码也可以反过来转换成汇编语言编写的代码。把本地代码转换为汇编代码的这一过程称为 反汇编,执行反汇编的程序称为 反汇编程序

本地代码和汇编语言一对一的转换:

cdabc39e134746d28b78281d54532aec.png

        哪怕是C语言编写的源代码,编译后也会转换成特定的CPU用的本地代码。而将其反汇编的话,就可以得到汇编语言的源代码,并对其内容进行调查。不过,本地代码变成C语言源代码的反编译,要比本地代码转换成汇编代码的反汇编要困难,这是因为,C语言代码和本地代码不是一一对应的关系

二、通过编译器输出汇编语言的源代码

本地代码可以经过反汇编转换成为汇编代码,但是只有这一种转换方式吗?显然不是,C语言编写的源代码也能够通过编译器编译称为汇编代码,下面可以进行尝试一下

首先需要先做一些准备,需要先下载 Borland C++5. 5 编译器,为了方便,我这边直接下载好了读者直接从我的百度网盘提取即可(链接:https://pan.baidu.com/s/19LqVICpn5GcV88thD2AnIA密码:hz1u)

下载完毕,需要进行配置,下面是配置说明(https://wenku.baidu.com/view/22e2f418650e52ea551898ad.html),教程很完整跟着配置就可以,下面开始我们的编译过程

首先用 Windows 记事本等文本编辑器编写如下代码

// 返回两个参数之和的函数
int AddNum(int a,int b){return a + b;
}// 调用AddNum 函数的函数
void MyFunc(){int c;c = AddNum(123,456);
}

        编写完成后将其文件名保存为Sample4.c,C语言源文件的扩展名,通常用.c来表示,上面程序是提供两个输入参数并返回它们之和。

        在Windows 操作系统下打开 命令提示符,切换到保存Sample4.c的文件夹下,然后在命令提示符中输入

bcc32-c-S Sample4.c

        bcc32 是启动 Borland C++的命令,-c 的选项是指仅进行编译而不进行链接,-S选项被用来指定生成汇编语言的源代码

        作为编译的结果,当前目录下会生成一个名为 Sample4.asm 的汇编语言源代码。汇编语言源文件的扩展名,通常用.asm来表示,下面就让我们用编辑器打开看一下 Sample4.asm中的内容:

.386p
ifdef ??verdion
if ??version GT 500H
.mmx
endif
endif
model flat
ifndef ??version
?debug macro
endm
endif
?debug S "Sample4.c"
?debug T "Sample4.c"
_TEXT segment dword public use32 'CODE'
_TEXT ends
_DATA segment dword public use32 'DATA'
_DATA ends
_BSS segment dword public use32 'BSS'
_BSS ends
DGROUP group _BSS,_DATA
_TEXT segment dword public use32 'CODE'
_ADDNUM proc near
?livel1@0:;; int AddNum(int a,int b){;push    ebpmov     ebp,esp;;;    return a + b;;
@1:mov    eax,dword ptr [ebp+8]add    eax,dword ptr [ebp+12];;  ;;  
@3:
@2:pop    ebpret
_AddNum endp
_MyFunc proc near
?livel@48:;;  void MyFunc(){;push    ebpmov     ebp,esp;;    int c;;    c = AddNum(123,456);;
@4:push    456push    123call    _AddNumadd     esp,8;;  };
@5:pop    depret
_MyFunc endp
_TEXT endspublic _AddNumpublic _MyFunc?debug D "Sample4.c" 20343 45835end

这样编译器就能成功把C语言转换成汇编代码了

 


http://chatgpt.dhexx.cn/article/nubn6gp1.shtml

相关文章

c-nasm简易的汇编语言编译器(nasm、nask语法)

c-nasm汇编器: GitHub - Changele08/c-nasm: 简易的汇编语言编译器 【基本信息】 简单的汇编语言编译器,源程序包含一个源文件,总共约为10000行(大部分为汇编指令->机器指令对照表) 使用devc5.11无错误无警告编…

记录:汇编语言编译器选择(vscode,永远的神)

我下了两个,一个是一个入门级的,要49块成为注册用户才能解锁全部功能,好像还容易崩。另一个是dosbox,太老了,界面交互性差,我因为安装过两次,出现了一些文件位置问题,运行总出bug&am…

03.汇编语言和编译器

机器指令 早期的程序设计均使用机器语言。程序员们将用0, 1数字编成的程序代码打在纸带或卡片上,1打孔,0不打孔,再将程序通过纸带机或卡片机输入计算机,进行运算。这样的机器语言由纯粹的0和1构成,十分复杂&#xff0…

软件测试报告

近期,老师给我们布置了一个任务,那就是软件的测试报告,刚刚接触测试报告的我,并不是很了解测试报告怎么写,我们又是如何进行测试的,这里,我将自己对测试的想法写在这里。 一、概述 本软件是根据…

【详解】服务可用性详细说明及其解决方案

该文章转自: 搜狐文章 链接 谈到高并发和高可用往往引起很多人的兴趣,有时候成为框架选择的噱头。实际上,它们往往和框架关系不大,而是跟架构息息相关。在很多时候,老码农会直面一个问题: “系统的服务可…

可用性并非阳春白雪

写代码?这个环节的工作其实不难。开发出人们真正想用的应用程序,然后把它们发布到用户手上,这才是难事! 长久以来,我一直着迷于Steve Krug的那本《Dont Make Me Think》。不仅因为那本书短小精悍,读来朗朗…

软件工程-需求分析

软件需求任务 功能需求 接口需求 性能需求 约束 可靠性和可用性需求 逆向需求 出错处理需求 将来可能提出的要求 功能需求(一定要有) 这方面的需求指定系统必须提供的服务。通过需求分析应该划分出系统必须完成的所有功能 性能需求(最好有) 性能需求指定系统必须满足的定时约束…

服务可用性的一知半解

谈到高并发和高可用往往引起很多人的兴趣,有时候成为框架选择的噱头。实际上,它们往往和框架关系不大,而是跟架构息息相关。在很多时候,老码农会直面一个问题: “系统的服务可用性是多少?是怎么得来&#x…

高可用性架构

1. 高可用性架构 高可用性是指一个系统经过专门的设计后具备的减少停工时间并能持续保持提供服务的高可用性质。该特性是衡量系统提供服务能力的一个特征,也是对系统进行设计时需要考虑在内的一个重要因素。   对于数据库系统而言,高可用、高可靠和高性…

系统可用性

一个网站、系统的战术包括可用性战术、可修改性战术、性能战术、安全性战术、可测试性战术、易用性战术。可用性是在某个考察时间,系统能够正常运行的概率或时间占有率期望值。它是衡量设备在投入使用后实际使用的效能,是设备或系统的可靠性、可维护性和…

系统可用性量表评估问卷

1,中文:可用性问卷 2,英文原版: sus Measuring Usability With The System Usability Scale (SUS) The System Usability Scale (SUS) was originally created as a “quick and dirty” scale for administering after usabili…

软件可靠性

知识点 主要难点和考点可靠性计算 串联系统 串联系统可靠性计算 并联系统 并联系统可靠性计算 并联系统有一个系统是可靠系统,整个并联系统就是可靠系统 1-R 表示系统的失效率 N模混合系统 可靠性计算 计算软件可靠性指标公式 可靠性:MTTF/(1MT…

软件测试中的可用性、可维护性、可靠性有什么区别?

我们生活在一个用户依赖于对服务的一致访问的可靠性时代。在相互竞争的服务之间进行选择时,对用户来说,没有比可靠性更重要的特性了。但是可靠性是什么意思呢? 为了回答这个问题,我们将根据可靠性工程中的其他度量来分解可靠性:可用性和可维护性。区分这些术语并不是语义…

可靠/可用性介绍

可靠/可用性主要目的是保护业务零中断和高用户体验。 可靠可用性基本概念 广义的可靠性(Reliability)由三个部分组成:可靠性(Reliability)、可维修性(Maintainability)和可用性(Avaliability)。其中狭义的可靠性是指产品在规定的条件和时间内完成规定功能的能力&a…

软件测试可用性常用指标

网站可用性 所谓网站可用性(availability)也即网站正常运行时间的百分比,业界用 N 个9 来量化可用性, 最常说的就是类似 “4个9(也就是99.99%)” 的可用性。 描述通俗叫法可用性级别年度停机时间基本可用性2个999%87.6小时较高可用性3个999.9%8.8小时具…

服务器系统可用性99.9,可用性99.9

可用性99.9 内容精选 换一换 云数据库 RDS服务支持切换主备实例的可用性策略,以满足不同业务需求。可选择 “可靠性优先”或者“可用性优先”两种策略。调用接口前,您需要了解API 认证鉴权。该接口仅支持MySQL引擎。仅支持主备实例,即:HA实例。实例在创建、数据库升级、创建…

软件设计中的可用性和可用性测试

什么是可用性 在创建软件的环境中,术语“可用性”表示一种方法,它将用户而不是系统摆在过程的中心。这一方法称作以用户为中心的设计,它从设计过程的一开始就将用户关心的问题和意见考虑在内,并提出在任何设计决策中用户的需要都应…

谈一谈软件系统的可用性

什么是可用性 系统的可用性用如下公式表示: 其中: MTBF:即平均无故障工作时间,英文全称是“Mean Time Between Failure”。是衡量一个产品(尤其是电器产品)的可靠性指标。单位为毫秒、秒钟、分钟、小时等…

功能测试 性能测试 可用性_6种可改善软件的可用性测试方法

功能测试 性能测试 可用性 Collette Stumpf是Surge的软件设计师。 成功的软件项目请客户,简化流程或以其他方式为您的业务增值。 但是,如何确保您的软件项目能够带来预期的改进? 用户会体验到更好的性能吗? 所有任务的生产率都会…

漫谈软件架构设计系列(一):可用性设计

作者:中国移动云能力中心 —— 胡建华 概要:高可用设计师应用软件架构设计的最基本要求,无论一个产品处于初创阶段还是快速增长期,作为一款商业软件面向用户提供服务,那么可用性的设计是必须予以考虑的。 一、基本概…