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

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

一、汇编语言和本地代码


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


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


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


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


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



 哪怕是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    ebp
   mov     ebp,esp
    ;
    ;
    ;    return a + b;
    ;
@1:
   mov    eax,dword ptr [ebp+8]
   add    eax,dword ptr [ebp+12]
    ;
    ;  ;
    ;  
@3:
@2:
   pop    ebp
   ret
_AddNum endp
_MyFunc proc near
?livel@48:
    ;
    ;  void MyFunc(){
    ;
   push    ebp
   mov     ebp,esp
    ;
    ;    int c;
    ;    c = AddNum(123,456);
    ;
@4:
   push    456
   push    123
   call    _AddNum
   add     esp,8
    ;
    ;  }
    ;
@5:
   pop    dep
   ret
_MyFunc endp
_TEXT ends
    public _AddNum
    public _MyFunc
    ?debug D "Sample4.c" 20343 45835
    end


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

目录
相关文章
|
2月前
|
编译器
【ARM汇编速成】零基础入门汇编语言之基本认识(一)
【ARM汇编速成】零基础入门汇编语言之基本认识(一)
|
3月前
|
网络协议 C++
解决MASM32代码汇编出错: error A2181: initializer must be a string or single item
解决MASM32代码汇编出错: error A2181: initializer must be a string or single item
|
4月前
|
存储 算法 程序员
神秘代码世界惊现高效秘籍!究竟是什么让汇编语言编程如此强大?快来一探究竟!
【8月更文挑战第31天】《代码之美:探索高效汇编语言编程的最佳实践》介绍了汇编语言在系统内核、嵌入式系统及高性能应用中的不可替代作用。书中强调了深入理解处理器架构、提升代码可读性、优化算法与数据结构及有效利用寄存器等最佳实践的重要性。通过具体示例,如在 x86 架构下实现高效的加法函数,展示了如何运用这些技巧编写出既高效又可靠的汇编代码,充分展现了汇编语言的独特魅力及其在现代软件开发中的价值。
52 0
|
2月前
|
存储 编译器 C语言
【ARM汇编速成】零基础入门汇编语言之C与汇编混合编程(四)
【ARM汇编速成】零基础入门汇编语言之C与汇编混合编程(四)
【ARM汇编速成】零基础入门汇编语言之C与汇编混合编程(四)
显示按下的键的编码的汇编源代码
显示按下的键的编码的汇编源代码
|
2月前
|
存储 移动开发 C语言
【ARM汇编速成】零基础入门汇编语言之指令集(三)
【ARM汇编速成】零基础入门汇编语言之指令集(三)
|
2月前
|
编译器 C语言 计算机视觉
【ARM汇编速成】零基础入门汇编语言之指令集(二)
【ARM汇编速成】零基础入门汇编语言之指令集(二)
258 0
【原创】报告CPU当前工作模式的汇编源代码
【原创】报告CPU当前工作模式的汇编源代码
加快软盘操作速度的汇编程序源代码
加快软盘操作速度的汇编程序源代码
|
3月前
|
Windows
【原创】DOS下TSR程序的汇编演示代码2--黑屏保护程序
【原创】DOS下TSR程序的汇编演示代码2--黑屏保护程序