这里所描述的汇编语言以16位的8086CPU为准
值得你牢牢记住的细节
- mov指令不能将数据(立即数)直接送入段寄存器,不能在两个段寄存器之间直接传送数据,也不能在两个内存单元之间直接传送数据。
- add和sub指令不可以对段寄存器进行操作。
- 栈的操作规则是“后进先出”且只进行字操作,入栈是先将SP的内容减2再存放数据,出栈是先读取数据再将SP的内容加2,栈空间需要我们自己安排大小,栈顶超界问题需要我们自己注意。
- 用常数表示的地址一定要加段前缀。
- 标号标识了一个地址,而段名相当于一个标号,它代表了段地址。
- 不可使用汇编指令、伪指令和其他特定含义的符号作为段名。
- 标号前使用操作符offset才取得标号的偏移地址。
- 在汇编源程序中,数据不能以字母开头,如果数据最高位为字母,就要在前面加0。
关于寻址方式
只有BX,SI,DI,BP这4个寄存器可以进行内存单元的寻址,这4个寄存器可以单独出现,或只能以4种组合出现:bx和si、bx和di、bp和si、bp和di。
几种寻址方式的常用格式及应用
寻址方式 | 应用举例 |
---|---|
立即寻址 | idata(idata为立即数) |
寄存器寻址 | mov ax,bx(源操作数和目的操作数均为寄存器寻址) |
直接寻址 | [idata] |
寄存器间接寻址 | [bx] |
相对寻址 | [bx+idata],用于数组:idata[si];用于结构体:[bx].idata |
基址变址寻址 | [bx+si],[bx][si],[bp][di]:bx或bp为基址,si或di为变址 |
相对基址变址寻址 | [bx+si+idata],用于结构中的数组项:[bx].idata[si];用于二维数组:idata[bx][si] |
几个简单的转移指令
无条件转移指令jmp
无条件的含义即任何时候程序执行到该指令都将跳转到指定位置。
jmp指令有以下几种格式:
- jmp short 标号
段内短转移,只修改IP,转移的位移范围为-128~127,机器码占两个字节。 - jmp near ptr 标号
段内近转移,只修改IP,转移的位移范围为-32768~32767,机器码占3个字节。 - jmp far ptr 标号
段间转移,修改CS和IP,又称远转移,机器码占5个字节,转移的目的地址在指令中,高地址为段地址,低地址为偏移地址。 - jmp 标号
取决于转移的位移范围,一般为段内近转移。
注意:如果转移的位移范围为-128~127,则以上4个格式都转变为jmp short 标号对应的机器码;如果转移的位移范围为-32768~32767,那么jmp short 标号将出错,jmp 标号、jmp near ptr 标号所对应机器码相同,jmp far ptr 标号产生对应5字节编码。 - jmp 16位reg
用相应寄存器的内容修改IP的内容。 - jmp word ptr 内存单元地址(段内转移)
内存单元地址处存放的是转移的目的偏移地址。 - jmp dword ptr 内存单元地址(段间转移)
内存单元地址处开始存放的是两个字,高地址处的字是转移的目的段地址,低地址处的字是转移的目的偏移地址。
条件转移指令jcxz
所有的条件转移指令都是短转移,对应的机器码中包含的是转移的位移。
格式:jcxz 标号
当(cx)=0时,跳转;当(cx)≠0时,不跳转,程序继续向下执行。该指令不改变CX。
循环指令loop
所有的循环指令都是短转移,对应的机器码中包含的是转移的位移。
格式:loop 标号
(1)(cx)=(cx)-1;(2)如果(cx)≠0,跳转;如果(cx)=0,不跳转,程序继续向下执行。
小技巧
掌握了以上的知识就可以灵活编写很多功能复杂的小程序了,提示:运用到以上的转移指令可以用来编程一个可以修改原来程序并再执行的程序哦!试着自己动脑尝试下,后面我会展示的。