逆向基础--汇编源程序认识(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,是正确的,如下图所示

相关推荐
我在人间贩卖青春5 天前
汇编之伪指令
汇编·伪指令
我在人间贩卖青春5 天前
汇编之伪操作
汇编·伪操作
济6175 天前
FreeRTOS基础--堆栈概念与汇编指令实战解析
汇编·嵌入式·freertos
myloveasuka5 天前
汇编TEST指令
汇编
我在人间贩卖青春5 天前
汇编编程驱动LED
汇编·点亮led
我在人间贩卖青春5 天前
汇编和C编程相互调用
汇编·混合编程
myloveasuka6 天前
寻址方式笔记
汇编·笔记·计算机组成原理
请输入蚊子6 天前
《操作系统真象还原》 第六章 完善内核
linux·汇编·操作系统·bochs·操作系统真像还原
myloveasuka6 天前
指令格式举例
汇编·笔记·计算机组成原理
我在人间贩卖青春7 天前
汇编之分支跳转指令
汇编·arm·分支跳转