初识intel汇编语言

intel汇编和AT&T语法格式上有所差异,不过个人觉得大体上还是差不多的

编写第一次intel汇编代码是在DEBUG环境下,DEBUG是基于命令行的16位调试器,可作为16位汇编语言程序的调试工具,但不支持32位指令。所以首先了解的肯定是如果使用DEBUG,首先在DOS窗口输入DEBUG进入DEBUG环境。以下是DEBUG一些常用命令(windows下不区分大小写):

DEBUG命令:

1.汇编命令 A(Assemble Command)

命令的格式为:

  A[<地址>]

该命令的功能是将用户输入的汇编语言指令汇编为机器代码,存入指定地址开始的内存单元。

若只给出偏移地址,则使用CS当前值作为段地址。若未指定地址,则从一个A命令的最后一个单元开始;若前面未用过A命令,则缺省为CS:IP。

当执行A命令时,DEBUG等待用户输入指令序列。输入每条指令后回车,再直接按回车键结束A命令。DEBUG将输入指令序列的机器码存入指定地址开始的内存单元中。

2.内存显示命令 D(Dump Command)

D命令用来显示内存单元的值,包括下列两种格式:

(1) D[<地址>]

显示由指定地址开始的若干内存单元值。对于80列显示模式,显示128个字节。如果未指定参数,则按一个D命令的结束地址开始显示。若前面未用过D命令,则缺省从CS:IP开始显示。

(2) D<地址范围>

该命令显示由<地址范围>指定的所有内存单元的值。

执行D命令后,屏幕左边显示的是内存地址,中间是从该地址开始的若干字节值(十六进制),右边是每个字节对应的ASCII字符,其中,“.”表示不可打印字符。

3.寄存器命令 R(Register Command)
R命令用来显示和修改寄存器的值,包括以下两种格式。
(1)R
显示所有寄存器和8个标志位的值,并反汇编CS:IP所指的指令。
(2)R<寄存器名>

显示指定寄存器的值,并等待用户键入新的值,按回车键结束R命令。其中,<寄存器名>只能是8086的16位寄存器AX、BX、CX、DX、SP、BP、SI、DI、DS、ES、SS、CS、IP与F(标志寄存器)。

4.运行命令 G(Go Command)
G命令的格式为:
     G[=<地址>][<断点地址1><断点地址2>···<断点地址10>]
其中,等号“=”后的<地址>指出程序执行的饿起始地址,如未指定,则缺省为CS:IP。指定的断点最多为10个,也可以没有。若只给出偏移地址,则使用CS当前值作为段地址。

G命令从指定地址开始执行内存中的程序,直到程序结束或遇到指定的任一断点时停止执行。若遇到断点,则显示所有寄存器和标志位的当前值以及要执行的下一条指令;若程序正常结束,则显示“Program terminated normally”。

因为第一次写intel汇编代码只用了这些命令,没有继续进行调试,其他命令就不做详细介绍。包括以下命令:

内存修改命令 E(Enter Command)
反汇编指令 U(Unassemble Command)
跟踪命令 T(Trace Command)
继续命令 P(Proceed Command)
退出命令 Q(Quit Command)
内存比较命令 C(Compare Command)
内存填充命令 F(Fill Command)
内存传送命令 M(Move Command)
搜索命令 S(Search Command)
十六进制数计算命令 H(Hex Command)
文件命名命令 N(Name Command)
装入命令 L(Load Command)
写盘命令 W(Write Command)
端口输入命令 I(Input Command)
端口输出命令 O(Output Command)

学会DEBUG常用命令后,接下来就可以写代码了,要求是实现求任意一些毫无规律的任意数的平方和,将这些数定义在内存中,如果平方和结果超过16位字长,则报出错信息,在屏幕上显示字符串“Overflow Error!”,并停止计算终止程序。

我完成的代码如下:

a100
mov cx,05
mov dx,0
mov si,0200
mov bl,[si]
mov al,bl
mul bl
add dx,ax
jc 0118
inc si
loop 0109
int 21
mov dx,0120
mov ah,9
int 21
int 20
db  'Overflow Error!$'
org 0200
db FF,FF,FF,FF,FF

在DEBUG模式下运行如下(系统为win03虚拟机):

初识intel汇编语言_第1张图片

此时dx寄存器的值已经大于16位,输出overflow error结束运算。


对于才开始学习汇编语言,感觉和之前学习高级语言有很大的区别。需要理解记忆的地方很多,包括汇编指令,每个寄存器的作用和结构,还有指令与寄存器之间的关系,内存的堆栈结构。需要的逻辑思维能力要求更高,对于想要入门的我往往想要看懂一段代码都需要大量时间查找指令和用到的寄存器,想要到独立完成一段汇编代码还有漫长的学习道路要走。

你可能感兴趣的:(计算机系统)