汇编学习笔记

 

  1. 基本概念

电子计算机的最小信息单位是bit,也就是一个二进制位。8个bit组成一个Byte,也就是一个字节。

            总线从逻辑上分为3类,地址、控制和数据总线。

            典型的CPU由运算器、控制器、寄存器等器件构成,这些器件靠内部总线相连。

8086 CPU有14个寄存器,每个寄存器有一个名称,分别是AX,BX,CX,DX,SI,DI,SP,BP,CS,SS,DS,ES,PSW。

            AX可以分为AH和AL,同理BX,CX,DX。

            汇编语句不区分大小写。

 

  1. 8086寻址模式

8086寻址模式:段地址X16+偏移地址=物理地址。

本质含义:CPU在访问内存时,用一个基础地址(段地址X16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址。

基础地址+偏移地址=物理地址

            偏移地址为16位,长度最大为64KB。

  1. 段寄存器

CS和IP是8086中最关键的寄存器。CS为代码段,IP为指令指针寄存器。

            8086加点启动或复位后,CS和IP设置为CS=F000H,IP=FFFFH

            通过jmp命令可以同时修改CS、IP内容。

 

 

  1. Debug调试

Debug是Dos,Windows提供的实模式程序的调试工具。可以查看CPU各寄存器中的内存、内存情况和在机器码级别跟踪程序的运行。

 

win7 64位没有debug功能,dos模拟器即DOSBOX,debug.exe。需要下载,链接如下:

http://www.dosbox.com/download.php?main=1

            运行dosbox模拟器。

            挂载,mount c d:\

            切换到c盘, c:

            运行debug命令即可。(debug.exe需要自己从网上下载,然后放到D盘)

            R查看修改CPU寄存器内存

            D查看内存中内容

            E改写内存中内容

            U将内存中指令翻译成汇编

            T执行一条机器指令

            A以汇编指令的格式在内存中写入一条机器指令

改变AX寄存器内容如下:

查看内存中内容

可以用“ d 段地址:偏移地址”

修改内存内容

通过U查看内存中汇编指令

 

[…]表示一个内存单元。[…]中0表示内存单元偏移地址。指令执行时,8086CPU自动取ds中数据为内存单元的段地址。

            8086不支持直接将数据传入到段寄存器中,ds是一个段寄存器,mov ds,1000H是非法的。

  1. 数据移动

Mov指令有几种形式:

Mov 寄存器,数据

Mov 寄存器,寄存器

Mov 寄存器,内存单元

Mov 内存单元,寄存器

Mov 段寄存器,寄存器

Mov 段寄存器,内存单元

Mov 寄存器,段寄存器

栈有两个基本操作:入栈和出栈。栈的操作规则为LIFO(Last In First Out,后进先出)

            栈顶的段地址存放在SS中,偏移地址存放在SP中。任意时刻,SS:SP指向栈顶元素。

            不能直接向段寄存器SS送入数据,需要用其他寄存器中转。

            Push,pop实质上就是一种内存传送指令,可以在寄存器和内存之间传送数据。

            Push指令是先: SP=SP-2,然后向SS:SP指向的字单元中送入数据。

            POP指令是:SP:SP指向的字单元中读取数据;SP=SP+2

            16位寄存器最大的栈大小为64KB

 

  1. 汇编编写

汇编语言源程序中,有两种指令,一种是汇编指令,一种是伪指令。汇编指令是有对应的机器码的指令,可以被便以为机器指令。伪指令没有对应的机器指令,最终不被CPU所执行。

            Segment和ends是一对成对使用的伪指令。

            一个有意义的汇编程序至少要有一个段,用来存放代码。

            Assmue伪指令的含义为“假设”。假设段寄存器和程序中的某一个用segment…ends定义的段相关联。

            伪指令由编译器来处理。

    1. 测试代码

代码如下:

assume cs:codesg

codesg segment

start: mov ax.0123H

         mov bx,0456h

         add ax,bx

         add ax,ax

        

         mov ax,4c00h

         int 21h

codesg ends

end

    1. 编译

使用masm 615版本进行编译。

输入:masm hello.asm

编程生成hello.obj目标文件。

得到目标文件后,需要对目标文件进行连接,得到可执行文件。

输入:link

然后根据提示输入文件名字。

生成.exe文件。

    1. 可执行文件装载原理

要运行程序P1,需要程序P2将P1加载到内存中,然后CPU控制权交给P1,P1执行完后将控制权还给P2。

  1. debug跟踪进程

debug可以将程序加载到内存,设置CS:IP指向程序入口,但是DEBUG不放弃对CPU的控制,这样可以使用debug相关命令来单步执行程序。

            例如:debug hello.exe

然后可以用命令进行调试。例如用T进行单步执行。

 

 

 

 

 

 

 

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/notbaron/article/details/81112998