【不求甚解】《汇编语言》第 5 章:[BX]和 loop 指令


前言

参考书籍:
王爽。汇编语言。北京:清华大学出版社, 2013:95-121

本人菜狗一枚,不敢咬文嚼字,只能站在巨人的肩膀上窥探一下未曾了解的世界。


[BX]

要完整地描述一个内存单元,需要两种信息:

  1. 内存单元的地址(段地址默认在 ds 中)
  2. 内存单元的长度(类型)(由具体指令中的其他操作对象(如寄存器)指出)

和 [0] 一样,[bx] 也表示一个内存单元,它的偏移地址在 bx 中。

; 段地址 SA 默认在 ds 中
; bx 中存放的数据作为一个偏移地址 EA
mov ax, [bx]   ; 将 SA:EA 处的数据送入 ax 中, 即 (ax) = ((ds) * 16 + (bx))
mov [bx], ax   ; 将 ax 中的数据送入内存 SA:EA 处, 即 ((ds) * 16 + (bx)) = (ax)
汇编指令数据变化语法描述
mov al, [0](al) = 0将常量 0 送入 al 中(与 mov al, 0 含义相同)
mov al, ds:[0](al) = ((ds) * 16 + 0)将内存单元中的数据送入 al 中
mov al, [bx](al) = ((ds) * 16 + (bx))将内存单元中的数据送入 al 中
mov al, ds[bx](al) = ((ds) * 16 + (bx))将内存单元中的数据送入 al 中

指令访问内存单元,必须使用 […] 表示内存单元

  • [常量]:若用常量直接给出内存单元的偏移地址,则要在 [] 的前面显式地给出段地址所在寄存器
  • [寄存器],若用寄存器间接给出内存地址的偏移地址,则段地址默认在 ds 中(显式隐式都可)

在访问内存单元时,用于显式地指明内存单元的段地址的 ds:(默认)cs:ss:es:,被称为段前缀

loop 循环指令

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

  1. (cx) = (cx) - 1
  2. 判断 cx 中的值(为零向下执行)(不为零转至标号处执行程序)

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

assume cs:code

code segment
    mov ax, 2
    
    ; cx 为循环次数
    ; s 标号内为循环体
    mov cx, 11
s:  add ax, ax
    loop s 

    mov ax, 4c00h
    int 21h
code ends

end 

安全空间

在不能确定一段内存空间中是否存放着重要的数据或代码的时候,不能随意向其中写入内容。
安全空间:0:200 ~ 0:2ff(谨慎起见,在使用前用 Debug 查看一下)。
DOS 和其他合法的程序一般不会使用 0:200 ~ 0:2ff 的 256 个字节的空间。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值