[BX]和loop指令(3)

109 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。 5.6段前缀

若不指明内存单元的段地址,默认为ds

也可自己指定

如:

mov ax,cs:[0]

mov bx,es:[0]

 

5.7一段安全的空间

随意向内存中写入数据是极其危险的,因为该地址可能存放着重要的系统数据或代码。

 

当写入数据触碰到系统保护的数据或代码时

image.png

 

DOS和其他合法程序一般都不会使用0:200~0:2ff的256个字节的空间。所以,我们使用这段空间是安全的。

 

5.8段前缀的使用

image.png

image.png

0:2000:20b改为 0020:00020:b表示,可使目标单元的偏移地址和原始单元的偏移地址从同一数值0开始。

优化前

assume cs:code
code segment
	  mov bx, 0
	  mov cx,12
	  mov dx,0
s 	  mov ax,0ffffh
	  mov ds,ax
	  mov dl,[bx];将ffff:bx中的数据送入dl
	  mov ax,0020h 
	  mov ds,ax
	  mov [bx],dl;将0020:bx中的数据送入dl
	  inc bx
	  loop s
	  
	  mov ax,4c00h
	  int 21h
code ends
end

缺点:每次循环要设置两次ds。(效率低下)

解决:用两个段寄存器分别存放源单元ffff:X和目标单元0020:X的段地址,这样就可以省略循环中需要重复做24次的设置ds的程序段。

优化后

es是附加段(替代ds)

image.png

  image.png

将循环段中的代码放入初始化代码段实现优化

es存放目标空间的段地址,ds存放源空间的段地址

 

实验四

image.png

 

assume cs:code
code segment
start:	mov ax, 0020h
		mov ds, ax
		mov bx, 0h
		mov cx, 64
s:		mov [bx], bl
		inc bx
		loop s
		
		mov ax,4c00h
		int 21h
code ends
end start

image.png

注:该处“mov ax,4c00h”之前的指令就是值这段源码的mov ax,4c00h

  image.png

mov ax,cs
mov cx,17h

image.png

 

可看到cx初始值即程序长度为1CH,-u翻译为汇编指令后,可以看出mov ax,4c00h之前共有17H空间(0000h~0016h)

记录一次报错

error A4910: cannot open file: D:\try\ML.err

ml.err 文件中保存了 ml.exe 进行编译时可能需要的显示的错误信息. 没有这个文件, 看到的可能只是错误代码, 没有错误的描述.

一开始下载masm时没有这个文件,从网上嫖下来后

再次ml 1.asm时,报出错误信息

error A2070: invalid instruction operands

无效的指令操作数(最后发现源码中直接对ds赋值导致报错....太蠢了)