逆向基础--汇编源程序认识(08)

一.介绍

1)编写汇编源程序

学习时可以使用Notepad++来编写源程序, 后期可以使用专门的汇编IDE。如: MASM32 用于Windows平台汇编开发、SASM跨平台的简单汇编IDE、VS Code + 汇编插件等等

2)对源程序进行编译连接(Link)

使用如:masm 来编译.asm(全称Assembly[əˈsembli])的文件,产生目标obj文件,再用link对目标文件进行连接生成可执行的文件

可执行的文件包含两部分内容:

--程序和数据:程序中的汇编指令翻译过来的机器码和源程序中定义的数据

--相关的描述信息:程序多大,要占用多少内存空间等

3)运行可执行文件

当执行1.exe时,操作系统依照可执行文件中的描述信息,将可执行文件中的机器码和数据加载入内存,并进行相关的初始化(比如CS:IP指向第一条要执行的指令)然后由CPU执行。

二.源程序

在汇编语言中,包含两种指令,一种是汇编指令,一种是伪指令。汇编指令是有对应机器码的指令,可以被编译成机器指令,最终被CPU执行。而伪指令并没有对应的机器码,最终不会被CPU执行,而是会被编译器所执行。

复制代码
assume cs:codesg
codesg segment
    mov ax,0123H
    mov bx,0456H
    add ax,bx
    add ax,bx
    
    mov ax,4C00H ;下面这二行是程序返回,类似return
    int 21H
codesg ends
end

2.1 伪指令

上面是一段汇编源程序,首先来看一下上面代码中出现的伪指令

1) xxx segment

复制代码
 xxx segment
 ......

 xxx ends

segment和ends是成对使用的伪指令,这是必须要用到的一对伪指令。 功能是定义一个段,segment说明一个段的开始,ends说明一个段的结束,一个段必须要有一个名称标识。     使用格式如下:

复制代码
段名 segment 
 .... 
段名  end

上面程序中定义了一个段,段的名称为:codesg (sg是段的缩写)

当然源程序可以由多个段组成,可以用来存放代码、数据、栈空间来使用,一个汇编源程序至少要有一个段:代码段

2) end

上面是ends是段的结束标记,end是一个汇编程序的结束标记,编译器在编译汇编程序的时候,碰到end,就会结束对源程序的编译,所以写程序时,是在结尾加上end。

3)assume

assume:假设,它可以用来假设某一段寄存器和程序中的某一个用segment ....  ends定义的段相关联。

在编程时,使用assume将有特定用途和相关的段寄存器关联起来。

上面程序中定义一个名为codesg的代码段,我们需要将CS段寄存器和该段进行关联,格式为:assume cs:codesg。 cs就代表了代码段的段地址。

如果要关联多个段,格式如下assume cs:codesg ds:datasg ss:stacksg

2.2 汇编指令

汇编指令是为了让计算机完成任务,汇编指令经过编译连接(link)之后会转换成对应的机器码。如下图所示:

上面源程序中的codesg称为标号。一个标号代表一个地址,作为一个段的名称,最终它编译连接(Link)之后处理为一个段的段地址。

在写源程序结构时,先定义段, 接着往段中写入汇编指令,并指明程序在何处end结束, 注释是用【; 】分号

1)源代码demo.asm示例

复制代码
assume cs:abc
; adb段用于求2的3次方,为8 (注释要去掉,不然编译的机器码不对)
abc segment
    mov ax,2
    add ax,ax
    add ax,ax
    
    mov ax,4C00H
    int 21H
abc ends
end 

//打开DOSBox 执行以下三个命令,最终运行demo.exe程序
masm demo.asm   
link demo.obj  
demo.exe

下面使用debug的-u 来查看反编译的结果,源码加了注释编译后机器码不正确,变成了ADD AX,BX(左图),可能是注释有中文(老版本的汇编器如MASM、TASM对中文支持不好)。

去掉了注释后,编译后机器码是正确的,变成了ADD AX,AX(右图),如下图所示:

去掉注释后的源码经过编译、连接后,使用debug的-t 来调试,最终ax=0008,是正确的,如下图所示

相关推荐
资料,小偿2 天前
4.1.2基于51单片机汇编语言出租车计价器proteus仿真出租车计价器,汇编语言51单片机
汇编·51单片机·proteus
ol木子李lo4 天前
Visual studio 2022高亮汇编(ASM)语法方法
汇编·ide·windows·visual studio
资料,小偿5 天前
4.1.1基于51单片机汇编语言出租车计价器可切换白天黑夜,可修改价格
汇编·51单片机·proteus
embrace995 天前
【C语言学习】数据在内存中存储
java·c语言·开发语言·汇编·c++·学习·算法
T.Ree.11 天前
汇编_mov指令
汇编
CC-NX12 天前
32位汇编:实验12动态链接库
汇编
资料,小偿12 天前
4.101基于8086国旗图案proteus8.9,8086彩灯图案流水灯图案,国期图案仿真,四个开关四种模式。近期本人原创
汇编·proteus
资料,小偿15 天前
4.29.3五种波形发生器8086波形发生器,锯齿波脉冲波正弦波三角波直流信号含调试视频➕18页5000字原创报告软件流程图proteus8.9近期原创的,
汇编·proteus
T.Ree.15 天前
汇编_读写内存
开发语言·汇编·c#
量子炒饭大师16 天前
【一天一个计算机知识】—— 【编程百度】翻译环境与运行环境
c语言·汇编·c++·gitee·机器翻译