1- 段前缀
mov ax,ds:[bx]
mov ax,cs:[bx]
mov ax,ss:[bx]
mov ax,es:[bx]
mov ax,ss:[0]
mov ax,cs:[0]
这些出现在访问内存单元的指令中,用于显式的指明内存单元的段地址的"ds,cs,ss,es"在汇编语言中称为段前缀
2- 一段安全的空间
在8086模式中,随意向一段内存空间写入内容是很危险的,因为这段内存空间可能存放着重要的代码或数据.
1 assume cs:code 2 code segment 3 mov ax,0 4 mov ds,ax 5 mov ds:[26H],ax 6 7 mov ax:4c00H 8 int 21h 9 code ends10 end
会发生错误.
在操作系统环境中工作,操作系统管理所有资源,也包括内存,如果我们需要向内存空间写入数据的话,要使用操作系统给我们分配的空间.而不应直接用地址任意指定内存单元,向里面写入.
1 ;将内存ffff:0~ffff:b单元中的数据拷贝到0:200~0:20b单元中 2 assume cs:code 3 code segment 4 mov ax,0ffffH 5 mov ds,ax 6 7 mov ax,0020H 8 mov es,ax 9 10 mov dx,011 mov bx,012 mov cx,1213 s:mov dl,ds:[bx]14 mov es:[bx],dl15 inc bx16 loop s17 18 mov ax,4c00H19 int 21h20 code ends21 end
总结:
(1) 我们需要向一段内存写入内容
(2) 这段内存空间不应存放系统或其他程序的数据和代码,否则写入操作很可能发生错误
(3) Dos方式下一般情况 0:200-0:300空间中没有系统或其他程序数据和代码
(4) 以后如果需要向一段内存中直接写入内容时,就使用0:200-0:300这段空间
0:200-0:300 可转为 0200H-0300H 即 020:0-030:0
3- [bx]和loop的使用
;向内存0:200-0:23F依次传送数据0-63(3FH)assume cs:codecode segment mov ax,0020H mov ds,ax mov bx,0 mov cx,65 s:mov ds:[bx],bl inc bx loop s mov ax,4c00H int 21hcode endsend
;将mov ax,4c00H之前的指令复制到内存0:200处assume cs:codecode segment mov ax,code mov ds,ax mov ax,0020H mov es,ax mov bx,0 mov cx,18H ;运行时debug p10.exe,后-r cx的值为1DH,为整个程序的长度,按照题目要求mov ax,4c00H之前的指令,那么mov ax,4c00H / int 21h 长度为5H 所以 1DH - 5H =18H s:mov al,[bx] mov es:[bx],al inc bx loop s mov ax,4c00H int 21hcode endsend
mov ax,4c00H / int 21h 长度为5H,为5字节,机器指令为B8004C CD21