数据寻址方式:
1.立即数寻址方式 MOV AH,12H ;12H为字节立即数
MOV AX,1234H ;1234H为字立即数
2.寄存器寻址方式 MOV AX,BX
3.直接寻址方式(存储器直接寻址方式) MOV AX,[100H]
4.寄存器间接寻址 MOV AX,[SI]
5.寄存器相对寻址方式 MOV AX,100H[SI](也可表示为MOV AX,[SI+100])
6.基址变址寻址方式 MOV AX,[BX][DI]
7.相对基址变址寻址方式 MOV AX,MASK[BX][SI]
程序转移寻址方式
1.段内直接寻址
指令格式为:
JMP SHORT ADDR2 这种寻址方式适用于条件转移及无条件转移指令,但是当它用 JMP NEAR PTR ADDR1 于条件转移指令时,位移量只允许为8为位。
2.段内间接寻址
指令格式为:
JMP BX
JMP WORD PTR [BX+ADDR]
3.段间直接寻址
指令格式为:
JMP FAR PTR ADDR
4.段间间接寻址
指令格式为:
JMP DWORD PTR [ADDR+BX]
ADC 带进位加法; INC 加1; SBB 带借位减法; DEC 减1; NEG 求补; CMP 比较。 LEA 有效地址送寄存器; LDS 取地址指针到DS; LES 取地址指针到ES。
LEA BX,TABLE和MOV BX,OFFSET TABLE在功能上是相同的,BX寄存器中都可以得到符号地址TABLE的有效地址值。MOV指令的执行速度比LEA指令更快,但是,OFFSET只能与简单的符号地址相连,而不能和诸如TABLE[SI]或[BX+SI]等复杂操作数相连。因此,LEA指令在取得访问符号地址方面是很有用的。
【例3,25】执行指令LEA BX,[SI+0F62H]
执行指令前,若(SI)=003CH,则指令执行后,(BX)=003CH+0F62H=0F9EH。
PF:奇偶标志,记录运算结果中含1的个数。若个数为偶数则置PF=1,否则清零。可用于检测数据传送过程中是否发生错误。
SF:符号标志,记录运算结果的符号,若结果为负则置1,否则清零。
无符号数条件转移
JA/JNBE 地址标号 高于/不低于等于时转移
JAE/JNB 地址标号 高于等于/不低于时转移
JB/JNAE 地址标号 低于/不高于等于时转移
JBE/JNA 地址标号 低于等于/不高于时转移
带符号数条件转移
JG/JNLE OPR 大于/不小于等于时转移
JGE/JNL OPR 大于等于/不小于时转移
JL/JNGE OPR 小于/不大于等于时转移
JLE/JNG OPR 小于等于/不大于时转移
常用的DOS系统功能调用
1、键盘输入
01号调用——从键盘输入单个字符
调用格式:
MOV AH,01
INT 21H
功能:等待从键盘输入一个字符并送入AL
0A号调用——从键盘输入字符串
功能:从键盘接受字符串送入内存的输入缓冲区,同时送显示器显示。
调用前要求:先定义一个输入缓冲区
MAXLEN DB 100 ;第1个字节指出缓冲区能容纳的字符个数即缓冲区长度,不能为0 ACLEN DB ? ;第2个字节保留,以存放实际输入的字符个数
STRING DB 100 DUP (?) ;第3个字节开始存放从键盘输入的字符串
调用格式:
LEA DX,MAXLEN(缓冲区首偏移地址)
MOV AH,0AH
INT 21H
2、显示输出
02号调用——在显示器上显示输出单个字符
调用格式:
MOV DL,待显示字符的ASCII码
MOV AH,2
INT 21H
09号调用——在显示器上显示输出字符串
调用格式:
LEA DX,字符串首偏移地址
MOV AH,9
INT 21H
子程序定义是由一对过程定义伪指令PROC和ENDP来完成的,格式如下:
子程序名 PROC[NEAR|FAR]
[保护现场]
子程序体
[恢复现场]
RET
子程序名 ENDP
0为正1为负反码符号位不变各位取反补码再加1
【例4.11】在以BUF为首址的字存储区中存放有N个有符号数,要求采用“冒泡法”将它们按从大到小的顺序排列在BUF存储区中,是编写其程序。
.MODEL SMALL
.STACK
.DATA
BUF DW 13,-4,6,9,8,2,11,-8,-6,-20,30
N=($-BUF)/2
.CODE
START: MOV AX,@DATA
MOV DS,AX
MOV CX,N
DEC CX
LOOP1: MOV DX,CX
MOV BX,0
LOOP2: MOV AX,BUF[BX]
CMP AX,BUF[BX+2]
JGE NEXT
XCHG AX,BUF[BX+2]
MOV BUF[BX],AX
NEXT: ADD BX,2
LOOP LOOP2
MOV CX,DX
LOOP LOOP1
MOV AX,4C00H
INT 21H
END START ;内外重循环控制次数;保存外重循环控制次数
第二篇:汇编语言实验心得
一.实验内容
1.DEBUG的启动及其基本命令的使用
2.内存操作数与寻址方式
1)利用DEBUG程序中的“E”命令,将两个多字节数“12345678H”和“FEDCBA98H”分别送入起始地址为DS:0200H和DS:0204H两个单元中。
2)分别用直接寻址方式和寄存器间接寻址方式编写程序段,实现将DS:0200H单元和DS:0204H单元中的数据相加,并将运算结果存放在DS:0208H单元中。
3.顺序程序设计
X、Y、Z、V均为字变量,在X、Y、Z、V字单元中存放是16位带符号数。试编写汇编语言程序完成以下功能:
①计算表达式值(V–(X*Y+Z-720))/X;
②将上述表达式运算结果整数放在SUM1单元,余数放在SUM2单元。
4.分支程序设计
1)设X,Y为字变量,假定不溢出,计算X=|X-Y|。
2)将NUM单元中的一位十六进制数(0~9,A~F),转换为对应的ASCII码值存入ASC单元。
3)已知字节变量X,编程求下列表达式
即:当x>0
当x=0
当x<0
5.循环程序设计
1)定义10个字节型带符号数,求其和。
2)在内存单元DATA中定义一个16位数,统计其16位中1的个数,存入内
存的字单元COUNT。
3)定义10个字型无符号数,编写程序求其最小值。
6.子程序设计
1)设计一个子程序,计算1+2+?+N,其中N为给定的正整数,且N小于100。
2)定义10个字型带符号数,编写子程序求其最大值和统计正数的个数。
3)从键盘接收4位十进制数,将其转换为十六进制数并显示。
二.实验心得
上学期学习计算机组成原理的时候就对汇编有所了解,但通过这学期的学习,使我更加深入了解了其知识体系和计算机组成及内部程序执行的原理。对于各命令的熟练掌握后,自己亲自动手实验更是体会到了各命令的用途及执行的方法。通过各个基本命令可以轻松更改计算机内部寄存器的值和读写内存,磁盘,I/O端口的值,通过更改观察其对计算机的影响变化。
对于汇编语言的寻址方式,更是多种多样,通过对各寻址方式的比较,可以感受到各寻址方式的不足与好处,还有是对各寻址方式的注意事项,有的寻址方式需专用的寄存器,有的寄存器是禁止使用的,然而有的就开放的多,对寄存器没有特殊要求,然而在编程过程中使用较为合适的寻址方式是提高程序运行效率的保障,在对寄存器中的值做运算时要正确书写各值,在X86中只支持十六进制数,在运算结束后值得保存也是很重要的,不能随意保存。写数据传送指令时,目的操作数和源操作数的类型一定要匹配,CS不能作为目的操作数。
在学习完汇编语言程序格式和结构后就可以完整的编写汇编语言程序了,在编程中各种结构的选择是对程序效率的保障,在顺序结构中就不需要各种选择分支结构,顺序结构适合一些较简单按顺序执行的程序,然而复杂程序的编写就需要用到选择结构和分支结构了。另外,我们还应该掌握DOS系统功能调用,宏汇编等知识。
现在课程已结束一段时间,虽然不是完全掌握,但是还是了解了一些基本操作,可以解决一些基本问题,想要学好汇编,还需花更多时间去学习。在今后的学习过程中尽可能完善自己。