汇编语言笔记5

第7、8章

loop指令

loop指令和循环有关,循环的次数和CX的值有关

loop指令执行过程:

  1. CX=CX-1
  2. 判断CX中的值,不为0则转移到标号处执行程序

CX中的值影响loop指令的循环结果。通常我们用loop指令来进行循环,CX中存放循环的次数

段前缀

我们可以在访问内存单元时显式地给出段寄存器,这就是段前缀

例子:

1
mov ax,ds:[bx]

and和or指令

and指令:逻辑与,按位进行与计算

or指令:逻辑或,按位进行或计算

大小写转换问题:

  1. 大小写的ASCII码相差32,即二进制的第五位为1还是0的问题(右边开始为第0位)
  2. 大小写转换就是and 11011111B,即可将小写转换为大写,or 00100000B,即可将大写转小写
  3. 或者直接对ASCII码进行加减20H处理

bx,si,di和bp

在8086CPU中,只有 bx,si,di,bp这四个寄存器可以用在【】中来表示偏移地址进行寻址。

使用其他寄存器是错误的

在这四个寄存器中:

  • **主:**bx,bp
  • 从:si,di

两主或两从不能同时出现在中括号中,下面的代码是错误的:

1
2
3
mov ax,[bx+bp]
mov ax,[si+di]
;都是错误的

在使用【bp】时,如果不显式指定段地址,那么段地址默认在SS中(堆栈段)

指令要处理的数据有多长?

8086CPU的指令可以处理两种长度的数据:byte和word。

机器指令中要指明要操作的数据有多长:

  1. 通过寄存器名指明:ax,al等
  2. 通过word ptr和byte ptr来指明
  3. 其他方法:例如push指令只对字型数据进行操作

div指令

div指令是除法指令。

  1. **除数:**除数有8位和16位两种。存放在寄存器或内存单元中

  2. **被除数:**如果除数为8位,被除数则为16位,默认在AX中存放。如果除数为16位,则被除数为32位,高16位存放在dx中,低16位存放在ax中

  3. **结果:**除数为8位,则结果为8位,商存放在al中,余数存放在ah中。除数为16位,则结果为16位,商存放在ax中,余数存放在dx中

  4. 格式:

    1
    2
    3
    div 寄存器
    div 内存单元
    div byte ptr ds:[0];指定除数为8位

伪指令db,dd,dw和操作符dup

**db用来定义字节型数据:**db 1

**dw用来定义字型数据:**dw 1

dd用来定义双字型数据 dd 1,占32字节

dup是一个操作符,用来进行数据定义的重复:dd 3 dup(0,1,1):定义9个双字型数据,三个0,三个1,三个1