程序取得空间的方法有两种
在课程中不讨论第二种(malloc)
从规范的角度,我们是不能自己随便决定那段空间可以使用,应该让系统来为我们分配。在程序中,定义我们希望处理的数据,这些数据会被编译,作为程序的一部分写入可执行文件。当可执行文件被加载入内存时,这些数据也同时被加载入内存中。
程序6.1
assume cs:code
code segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
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
dw
dw
即“define word”定义字型数据(16位)
程序6.2
assume cs:code
code segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
start: mov bx,111H
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
代码6.3
assume cs:code
code segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
start:
mov sp,30h
code ends
end
解读内存:
放入同一段有两个问题
代码6.4
assume cs:code,ds:data,ss:stack
data segment
dw 0123h,0456h,0789h,0defh,0fedh,0cbah,0987h
data ends
stack segment
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,20h
mov ax,4c00h
int 21h
code ends
end start
不难想到为什么叫段地址叫做 ds
,ss
,cs
了吗,分别就是
data segment,stack segment,code segment的缩写
对于mov ax,data的意义
名称为”data”的段的段地址送入ax。一个段的段地址可以由段名表示
还有几个疑问
assume
到底有什么实质作用?
作者说,并不会是cpu的寄存器指向这些段,不必去深究。。暂时也没看到深究的必要。如果以后有必要的话,一定会深究到底。