今天终于敲下了第一段汇编代码,虽然很简单,但觉得汇编还是挺好玩的。
MASM filename.asm ;汇编目标文件 ,生成obj文件
LINK filename.obj ;连接生成的obj,生成filename.exe可执行文件
BEBUG filename.exe ;调试程序
在DOS调试汇编常用到的几个指令:
R命令:查看、改变CPU寄存器的内容
D命令:查看内存中的内容
E命令:改写内存中的内容
U命令:将内存中的机器指令翻译成汇编指令
T命令:执行一条机器指令
A命令:以汇编指令的格式在内存中写入一条机器指令
下面是我写的一顿三个数求和的代码,比较简单:
DATA SEGMENT ;数据段
NUM DB 12H,08H,2FH ;变量NUM
SUM DB ? ;变量SUM
DATA ENDS ; 数据段结束
CODE SEGMENT ;代码段
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA ;将数据段段地址赋值到AX
MOV DS,AX ;将AX中的值赋值到DS(堆栈段寄存器)
MOV CX,3 ;初始化循环次数到CX
MOV BX,OFFSET NUM ;将变量NUM在数据段中的偏移量赋值到你BX
MOV AL,0 ;初始化AL为0
LOOPER: ADD AL,[BX] ;将数据段中偏移量BX的加到AL中
INC BX ;BX自增1
INC CX ;计数器自减1
JNZ LOOPER ;计数器不为0,转LOOPER
MOV AH,4CH ;设置AH为中断21H的4CH号功能,4CH号功能是退出程序
INT 21H ;21H是DOS的系统调用中断,使用AH来选择功能
CODE ENDS ;代码段结束
END START
8086指令系统的寻址方式包括有数据寻址方式和地址寻址方式大类:
1).数据寻址方式,包括有以下几种方式:
1.立即数寻址方式。只能作为源操作数来给寄存器或存储单元赋值。如:MOV CX,3
2.寄存器寻址方式。操作数存放在指令规定的寄存器中。如:MOV BX,AX
3.存储器寻址方式,又可分为以下几种:
a).直接寻址方式。操作数有效地址只包含位移量一种分量,对于这种方式有:EA=位移量。如:MOV AL,[1064H]
如果没有特殊指明,直接寻址方式的操作数一般在存储器的数据段中,即隐含的段寄存器是DS。但是8086允许段超越,在指令中有关操作数前面表明操作数所在段的段寄存器名。如:MOV AL,ES:[1064H]
可以用符号地址来表示位移量,如:MOV AL,[value] 或 MOV AL,value
b).寄存器间接寻址方式。操作数有效地址只包含基址寄存器(BX)的内容或变址寄存器(SI、DI)的内容一种分量。寄存器给出实际操作数在数据段(默认)内的偏移量。如:MOV AX,[SI]
当然,寄存器间接寻址方式也允许段超越。
c).寄存器相对寻址方式。操作数有效地址EA是一个基址寄存器或变址寄存器的内容与指令中给定的8位或16位位移量之和,可用做基址寄存器有BX、BP、SI、DI。一般情况下,若指令中指定的寄存器是BX、SI、DI,则操作数默认认为在数据段中,若是BP则默认在堆栈段中。位移量既可以是8位或16位立即数,也可以是符号地址。如:MOV CX,[BX+COUNT]
该寻址方式可以有以下三种书写方式:MOV AL,[BP+TABLE] MOV AL,[BP]+TABLE MOV AL,TABLE[BP]
其中TABLE是8或16位偏移量。允许段超越。
d).基址变址寻址方式。操作数有效地址是一个基址寄存器(BX或BP)和一个变址寄存器(SI或DI)的内容之和。一般情况下,由基址寄存器决定操作数在哪个段中。操作数书写方式有以下几种:MOV AX,[BX+SI] MOV AX,[BP][SI]
e).操作数有效地址是一个基址寄存器内容和一个变址寄存器内容与指令中指定的一个8位或16位位移量之和。同样由基址寄存器决定操作数在哪个段中,允许段超越。操作数书写方式有以下几种形式:MOV AX,[BX+SI+COUNT] MOV AX,[BX][SI+COUNT] MOV AX,[BX+SI]COUNT MOV AX,[BX][SI]COUNT MOV AX,COUNT[BX][SI]
4.I/O端口寻址方式
a).端口直接寻址方式。端口地址用(0~255)表示。
b).端口间接寻址方式。当端口地址大于FFH时需要事先将端口地址存入DX中,然后作为指令操作数。
2).地址寻址方式,包括有以下寻址方式:
1.段内直接寻址方式。也称相对寻址方式。转移的地址是当前的IP内容和指令规定的下一条指令到目标地址之间8位或16位相对位移量之和,相对位移量可正可负。8位位移量称为短转移,16位位移量称为近转移。这种寻址方式适用于无条件转移或条件类转移。但条件转移只有8位位移量的短转移。
2.段内间接寻址方式。该寻址方式的程序转移地址存放在寄存器或存储单元中。
3.段间间接寻址方式。指令中直接给出16位段地址和偏移地址来更新当前CS和IP的内容。当然也可以直接使用已定义的远标号。
4.段间间接寻址方式。指令给出的存储器寻址方式求出的存放转移地址的四个连续存储单元的地址,前两个单元的内容送往IP,后两个单元的内容送往CS。