1. Assembly

Assembly-包含多个段的程序 & DEBUG使用指南

时隔近一年,再次拾起Asm,这次因该可以一下学到底?

我使用的工具是DOSBox->使用 DOSBox 学习 Assembly

今天就拿书上的程序6.4例子看一看吧!顺便提一下我用的是王爽的《汇编语言(第3版)》很棒的汇编入门教材。

直接看程序:

assume cs:code,ds:data,ss:stack

data segment
    dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
data ends

stack segment
    dw 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
stack ends

code segment

start:  mov ax,stack
        mov ss,ax
        mov sp,20h ;设置栈顶ss:sp指向stack:20

        mov ax,data
        mov ds,ax   ;ds:bx指向data段中的第一个单元

        mov bx,0
        mov cx,8
    s:  push [bx]
        add bx,2
        loop s  ;此循环是将data段中的0~15单元中的8个字型数据依次入栈

        mov bx,0
    s0: pop [bx]
        add bx,2
        loop s0 ;此循环是将出栈8个字型数据到data段的0~15单元中

        mov ax,4c00h
        int 21h
code ends

end start

这个程序将数据,代码,栈放到了不同的段中,这样可以使得代码显得结构清晰。

功能分析:使用栈将数据段中的8个字型的数据进行反转。

下面通过DEBUG来运行

使用t命令进行单步运行(后面会总结常用的DEBUG命令)

通过第一个红框可以发现DS段地址为076A,此时我们使用-d命令查看076a:0开始向后128个单元的内存内容可以发现我们在数据段中定义的8个字型数据(存放为高字节在前,底字节在后)

继续使用-t命令执行

执行完后再次使用-d命令查看内存 发现076a:0—-076a:9这段内存中的数据的确反转了。

 

下面是DEBUG工具常用命令:

DEBUG下最常用的调试指令为六个

一、常用DEBUG命令

(1)R :查看更改cpu寄存器内容

(2)D:查看内存中内容

(3)E:改写内存中内容

(4)U:将内存中机器指令翻译成汇编指令

(5)T:执行一条机器指令

(6)A:以汇编格式在内存中写入一条指令

二、常用命令的使用

1.R命令:查看 更改CPU寄存器内容

输入r后回车,会显示所有寄存器的数值

如果修改寄存器数据 如ax寄存器数值 则输入“r ax”后回车,在“:”后输入新数据,回车则修改完成。

2.命令d: 查看内存数据

D命令显示数据个数如下所示,内存地址格式为【段地址:偏移地址】,段地址和偏移地址共同组成内存地址,实际内存地址=段地址+偏移地址

直接输入d 显示的内存区域地址为上次查看位置后内存数据

输入命令时,可以直接输入内存地址,查看制定地址的内存数据。如D【1000:0000】 直接显示命令 段地址为1000,偏移地址为0 的内存数据。

采用“d 段地址:起始偏移地址 结尾偏移地址 ”可以查看起始地址到结尾地址范围内的数据 。如“d 073f:0 9” 查看数据范围为“073f:0 ~ 073f:9”

3.E命令改写内存中的数据

(1)“e 段地址:偏移地址 数据1 数据2 … 数据n”方式,一次性修改指定地址的n个数据

(2).”e 段地址:偏移地址” 按照提示 单个输入

输入命令后,光标停在“.”后,“.”前为改地址原始数据,在“.”后输入新数据 ,按空格 修改下一个地址数据。输入完成,直接按回车

(3)“e 段地址:偏移地址 ‘字符1’ ‘字符2’ …‘字符n’ ”在指定地址输入n个字符

4. 命令 U 将指定地址的机器码翻译为汇编指令,并显示出来

格式:“U 段地址:偏移地址”

5.T指令 执行一条或者多条指令

使用T 指令 执行内存地址为【CS寄存器数值:IP寄存器数据】位置的指令

(1)ax寄存器原始数据为0000,修改cs:ip = 1000:100后,在cs:ip 写入 “MOV AX , 1”的机器码,使用t命令执行后,ax寄存器数据被修改为0001

6.A命令,以汇编形式在内存中输入机器指令

Happy Coding!!!