本文已参与「新人创作礼」活动,一起开启掘金创作之路。 5.6段前缀
若不指明内存单元的段地址,默认为ds
也可自己指定
如:
mov ax,cs:[0]
mov bx,es:[0]
5.7一段安全的空间
随意向内存中写入数据是极其危险的,因为该地址可能存放着重要的系统数据或代码。
当写入数据触碰到系统保护的数据或代码时
DOS和其他合法程序一般都不会使用0:200~0:2ff的256个字节的空间。所以,我们使用这段空间是安全的。
5.8段前缀的使用
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)
将循环段中的代码放入初始化代码段实现优化
es存放目标空间的段地址,ds存放源空间的段地址
实验四
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
注:该处“mov ax,4c00h”之前的指令就是值这段源码的mov ax,4c00h
mov ax,cs
mov cx,17h
可看到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赋值导致报错....太蠢了)