blubiu

My Love

上网不网恋,简直浪费电.


汇编语言笔记(三)--[bx]和loop指令


前言:

[bx]和loop指令


目录:


[bx]指令:

[bx][0] 有些类似,[0] 表示内存单元,它的偏移地址是 0

比如:

mov ax,[0]

将一个内存单元的内容送入 ax ,这个内存单元的长度为 2字节(字单元)

存放一个字节,偏移地址为 0 ,地址段在 ds

mov a1,[0]

将一个内存单元的内容送入 a1 ,这个内存单元的长度为 1字节(字单元)

存放一个字节,偏移地址为 0 ,地址段在 ds 中,其中 a1 是字符串,只传送一个字节。


在编译器中 mov ax,[0] 指令会被编译器认为是 mov ax,0 所以引入 [bx] 的概念

mov [bx],ax 表示 (ds)*16+(bx)=ax

用法和之前的ds[address]一样


[bx] 的使用方法:

mov ax,1000H

mov bx,2000H

mov ds,ax    ; ds数据段寄存器赋值为2000H

mov [bx],ax    ; ax寄存器的值赋给内存单元21000H位置

其他方式:

mov ax,ds:[0] ; 将内存单元20000H位置的值赋给ax


loop指令:

loop 是循环指令

指令的格式是:loop 标号,

CPU 执行 loop 指令的时候,要进行两步操作:

① (cx)=(cx)-1

② 判断cx中的值,不为零则转至标号处执行程序,如果为零则向下执行。

通常我们用loop指令来实现循环功能,cx 中存放循环次数。


例如:编程计算 2^2,结果存在 ax 中

分析: 设 ax=2,可计算 ax=(ax)*2,最后 ax 中为 2^2的值,

N*2 可用 N+N 实现

程序如下:

assume cs:code
code segment

	mov ax,2
    add ax,ax
    mov ax,4c00h    ; 程序返回
    int 21h
code ends    ; 代码段结束
end


假如计算 2^12,则需要写 11 条重复的指令 add ax,ax

显然我们不希望这样来写,

这时,我们可以用 loop 来做

比如:

assume cs:code
code segment
start:mov ax,2
      mov cx,11      ; 设定循环次数为11
      s:  add ax,ax        ; 每次循环执行的操作,每次执行的时候使cx-1
      loop s        ; 验证cx的值是否为0,为0执行下面的程序,否则跳回ss可以为任意字符串)执行
      mov ax,4c00h    ; 程序返回
      int 21h
code ends    ; 代码段结束
end start

总结:

[bx] 和 loop 指令。