汇编语言学习心得(二):Debug、DS寄存器、字

在王爽老师的《汇编语言》一书中,提到了debug这一工具。Debug是dos和windows都提供的一种程序调试工具,使用它,可以查看寄存器和内存的内容。并且可以修改,写入,执行汇编、机器指令。

Win10的电脑已经不再支持command指令和debug工具,方法一是在网上下载dosbox以及debug.exe配合使用。也可以采用vmware+windowsxp的虚拟机来使用debug工具。接下来枚举一下debug的主要指令以及功能。

-r 该命令用来显示、改变寄存器的内容。如 -r ax 可以改变寄存器ax的内容,也可以-rax不带空格。

-d 该命令用来显示内存中的内容,默认显示左下角地址为起始位置的128个内容。后面可接地址,如-d 1000:0,则显示段地址为1000,偏移地址为0的起始地址的内容。

-e 该命令用于修改内存中的内容,后接地址,格式同-d命令。

-u命令可将内存中的机器指令翻译成汇编指令,默认为左下角地址所指内存。可指定内存,格式同-d命令。

-t 命令可执行一条机器指令,执行的命令为CS 和IP中的地址指向的命令,后面不可指定地址。

-a 命令可以向内存中以汇编指令的形式写入指令,默认为-r左下角地址,可指定地址,格式同-d命令。

在写入命令时,既可以用-e直接修改内存中的机器码,也可以用-a写入汇编代码。写入内存地址后,-t执行的是CS IP中的地址,所以要先用-r命令修改CS IP为待执行地址,再使用-t执行。

字由两个字节构成,所以在8086CPU中,每个字用16位寄存器储存。高位放在高地址单元,低位则放在低地址单元里面。

8086CPU里面,有一个寄存器叫做DS(段寄存器),用于存放数据的段地址。CS也是段寄存器,不过为了区分,CS段寄存器专门用来存放指令,而DS存的是不可执行的数据。

当执行汇编指令 mov AX,[1]时,中括号内的内容其实是当前的偏移地址,那么如何确定段地址呢?此时的段地址即为DS寄存器内存储的地址。

当修改段寄存器的地址时,我们容易想到使用 MOV DS,3333H的语句。这样的操作叫做“立即寻址方式”,被传送的数据叫做立即数。但实际上这样做是非法的,因为CPU不支持直接将立即数送入段寄存器。Google给出的原因是由于立即数直接写入段寄存器这样的指令,被翻译成机器码之后将占用更多的字节,在事先规定的指令长度范围内无法存贮下这么多的内容,因此改由先写入通用寄存器,再由通用寄存器写入段寄存器的办法代替。立即数实际上是相当占地方的。只能通过间接迂回的方式。MOV AX,3333H MOV DS,AX。先将数据送入一般寄存器,再把一般寄存器的值送入段寄存器。

数据从寄存器到内存地址的方式是内存地址到寄存器的逆过程,只需MOV [0],AX即可。

因为8086CPU是16位结构,可以一次性传输16位数据,也就是一个字的数据。

0%