《汇编语言(第三版)》王爽笔记(5) [BX]和loop指令

第五章 [BX]和loop指令

[]描述一个内存单元的偏移地址,但仅有地址还不够,还需要内存单元的长度(类型 )。如 mov al, [0] 表示将DS:0位置的一个字节送入al,而mov ax, [0]则是将DS:0位置的两个字节送入ax。
[bx]同样描述一个内存单元,偏移地址在bx中,段地址在ds中。
约定使用()来描述一个寄存器或内存单元(存放物理地址)中的内容。如(ax),(20000H),(ds),((ds)*16+(bx))。
描述push ax: (sp)=(sp)-2 ((ss)*16+(sp))=(ax)
描述pop bx: (bx)=((ss)*16+(sp)) (sp)=(sp)+2
(X)表示的数据有两种类型,字节和字。由寄存器名或具体运算决定。
约定使用idata表示常量,mov ax,[0] --> mov ax,[idata]
mov bx,2 --> mov bx,idata
() 和 idata 都是为了方便描述定义的,使用非法!

inc bx --> bx=bx+1

我们通常 用loop实现循环,cx存放循环次数。
CPU执行loop指令:① (cx)=(cx)-1 ②判断cx中的值,不为0则转至loop标记处继续执行,为0则向下执行。
示例代码:计算212

assume cs:code

code segment

	mov ax,2

	mov cx,11
s:	add ax,ax   //s为标号,标识了一个地址,这个地址处有一条指令add ax,ax
	loop s //CPU执行loop指令,每次先将cx-1,然后判断cx是否为0,不为0则转至标号        s标识的地址处执行,否则执行下一条指令 mov ax,4c00h

	mov ax,4c00H
	int 21H

cx与loop搭配的模板程序段:

mov cx, 循环次数
s:
	循环程序段
	loop s

**在汇编源程序中,数据不能以字母开头。eg 9839H可以写成9839H,但A222H必须写为0A222H.

在这里插入图片描述
执行读取内存的指令时,debug右侧会显示即将读取的内存内容,图中为32H。

G命令:-g 0012 —> CS:0012 之前的指令一次性被执行
P命令:一次性结束loop循环,也可以用g 偏移地址(循环结束的下一指令) 来结束循环。

debug和汇编编译器masm对指令的不同处理:
对于指令mov ax,[0]
debug中表示将ds:0处的数据送入ax
汇编源程序中,该指令被编译器当做mov ax,0处理。
想要通过源程序访问2000:0单元,可以如下操作(借助bx间接给出偏移地址):

mov ax,2000h
mov ds,ax
mov bx,0
mov al,[bx]

或者(在[]前面给出段地址所在的段寄存器):

mov ax,2000h
mov ds,ax
mov al,ds:[0]    //"ds:" 被称作段前缀

当需要用同一种方法处理地址连续的内存单元中的内容时,一般选择使用循环,此时[]内的偏移地址不再是一个常量,因此需要用可以改变的bx,以[bx]形式作为一个可变的偏移地址使用。

不应该随意向一段内存中写入数据,而要使用操作系统分配给我们的空间。
我们所使用的实模式下运行的DOS没有能力严格地管理硬件,但对于运行于CPU保护模式下的操作系统,我们无法用汇编语言操控真实的硬件。
需要向内存写入内容时,一般使用0:200 - 0:2ff这256个字节的空间。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值