问题:这样做是危险的!
- 例:将内存fff:0ffff:b中的数据拷贝到0:2000:20b单元中。
- 问题
- 程序中直接写地址,危险!
- "安全"位置存放数据,存哪里?
- 对策
- 在程序的段中存放数据,运行
时由操作系统分配空间。 - 段的类别∶数据段、代码段、栈段
- 各种段中均可以有数据
- 可以在单个的段中安置,也可
以将数据、代码、栈放入不同
的段中
- 在程序的段中存放数据,运行
;使用附加段寄存器
assume cs:code
code segment
mov ax,0ffffh
mov ds,ax
mov ax,0020h
mov es,ax
mov bx,0
mov cx,12
s:mov dl,[bx]
mov es:[bx],dl
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end
应用案例(在代码段中使用数据
- 问题:编程计算以下8个数据的和,结果存在ax寄存器中
0123H,0456H ,0789H ,0abcH,odefH ,ofedH ,0cbaH,0987H
assume cs:code
code segment
dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H;在代码段中定义数据
;dw:define word,定义字型数据 db 定义一个字节 dd 定义一个双字
mov bx,0
mov ax,0
mov cx,8
s:add ax,cs:[bx]
add bx,2
loop s
mov ax,4c00h
int 21h
code ends
end
-
解决问题的关键:让数据从CS:0000开始,让代码从CS:0010开始!
-
改进
assume cs:code
code segment
dw0123H,0456H,0789H,8abcH,0defH,0fedH,0cbaH,0987H
start:mov bx,0;定义一个标号,指示代码开始的位置。
mov ax,0
mov cx,8
s:add ax,cs:[bx]
add bx,2
loop s
mov ax,4c00h
int 21h
code ends
end start;end的作用:除了通知编译器程序结束外,还可以通知编译器程序的入口在什么地方。
- 效果:程序加载后,CS:IP指向要执行的第一条指令在start处!