汇编语言——[bx]和loop指令(基于8086CPU)

mov ax, [bx]

  • 偏移地址只能用bx
  • 对于汇编代码,直接使用mov ax, [0]其实是把0赋给ax,而不是对于偏移地址为0的内存块赋给ax
  • 需要先把0赋给bx,mov bx, 0,再用mov ax,[bx]把对应的内存块赋值给ax。
  • 可以在汇编中使用 mov ax, ds:[0]来达到类似效果,把ds:0的内容放到ax中,这样可以省略使用bx的步骤。

描述性符号"()"

这里的描述性符号只是为了方便描述,不是说程序可以这样写

  • 代表取地址,或者说取内容
  • (ax)=0010H;代表ax中的内容0010
  • 2000:1000处的内容为0010,可以这样(21000)=0010;
  • 对于mov ax, [2]可以这样(ax) = ((ds)*16+2)代表地址寄存器的位置向左移一位,加上偏移地址,取里边的内容,赋值给ax
  • 对于mov [2],ax可以这样 ((ds)*16+2)=(ax)代表地址寄存器的位置向左移一位,加上偏移地址,取ax里边的内容,赋值给内存
  • 对于pop ax,等同于(ax) = ((ss)*16+sp) (sp)=(sp)+2

约定符号idata表示常量

  • 汇编语言——[bx]和loop指令(基于8086CPU)_第1张图片

inc/dec指令

  • inc ax ax自增加一
  • dec ax ax自减减一

loop 指令

  • 指令格式loop 标号
  • 只能用CX来存放循环次数
  • loop指令的标号所标志的地址要在前边
  • 标号其实标记一个地址,标号会被翻译成一个偏移地址

  • loop其实是改变IP,跳转回之前标记的偏移地址
  • cpu执行loop指令需要两步执行:(cx)=(cx)-1; 判断ax中的值,不为零则转至标号处执行程序,为0则向下执行。
  • 汇编语言——[bx]和loop指令(基于8086CPU)_第2张图片
assume cs:code

code segment
start:
    mov ax, 2
    mov cx, 4
    s:add ax,ax
        loop s
    
    mov ax, 4c00H
    int 21H
code ends
end start

在汇编中,数据不能以字母开头

  • start: mov ax, f2会编译错误
  • 需要以0开头,以H结尾表示其为十六进制。mov ax, 0f2H
  • 汇编语言中,默认是十进制,跟debug程序中不一样,尾部加H才是十六进制

debug循环调试的g命令

  • g命令类似于断点调试,g xxxx就是让程序执行到xxxx结束
  • 例如,循环到04ae:000a结束,那么可以g 000a,程序会一直执行到000a为止
    汇编语言——[bx]和loop指令(基于8086CPU)_第3张图片

将八位的数据累加到十六位的寄存器中

注意前提是八位数据,而不是十六位数据

  • 计算ffff:0~ffff:b单元中的八位数据的和,存储在dx中,因为dx是十六位的寄存器,而内存单元是八位一格,所以两边是不匹配的,不能直接赋值。
  • 解决方法,把内存单元中的八位数据存到一个中介寄存器中,例如 mov al,ds:[0]再用寄存器去加
  • 使用loop
  • 汇编语言——[bx]和loop指令(基于8086CPU)_第4张图片

一段安全的空间

  • 8086模式下随意向一段内存空间中写入数据是很危险的,因为这段内存可能有其他信息
  • 一般的PC机中,dos和其他合法程序都不会使用0:200H~0:2fffH这一段256个字节的空间,所以使用这一段空间是安全的。

内存

  • 默认ds是存储内存段地址
  • 也可以用mov ax, es:[0]显式的使用段地址,

你可能感兴趣的:(其他)