[汇编语言]-第五章段前缀及使用 一段安全的空间

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

posted @ 2014-02-11 11:50  galoishelley  阅读(838)  评论(0编辑  收藏  举报