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 ends 10 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,0 11 mov bx,0 12 mov cx,12 13 s:mov dl,ds:[bx] 14 mov es:[bx],dl 15 inc bx 16 loop s 17 18 mov ax,4c00H 19 int 21h 20 code ends 21 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:code code 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 21h code ends end
;将mov ax,4c00H之前的指令复制到内存0:200处 assume cs:code code 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 21h code ends end
mov ax,4c00H / int 21h 长度为5H,为5字节,机器指令为B8004C CD21
![](https://images0.cnblogs.com/blog/578570/201402/111459104838646.png)