您的位置:首页 > 其它

[置顶] [汇编学习笔记][第六章包含多个段的程序]

2016-04-20 16:37 288 查看

第六章 包含多个段的程序

程序取得空间的方法有两种

在加载程序的时候为程序分配

程序执行过程向系统申请

在课程中不讨论第二种(malloc)

6.1 在代码段使用数据

从规范的角度,我们是不能自己随便决定那段空间可以使用,应该让系统来为我们分配。在程序中,定义我们希望处理的数据,这些数据会被编译,作为程序的一部分写入可执行文件。当可执行文件被加载入内存时,这些数据也同时被加载入内存中。

程序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


并没有start这个指令,start并不是保留字符

主要是end的作用,end除了通知编译器程序结束,还可以通知编译器程序的入口在什么地方。这里我们用end制定了入口在标号start的地方,我们也可以制定标号dddd,yyyy。

6.2 在代码段中使用栈

代码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


解读内存:

CS:00- CS:0F 存放数据

CS:10- CS:2F 存放栈

所以栈指针初始为CS:30

6.3 将数据,代码,栈放入不同的段

放入同一段有两个问题

放入同一段,程序显得混乱

如果数据,栈和代码超过64KB,就不能放到一个段里了(X86约束)

代码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的寄存器指向这些段,不必去深究。。暂时也没看到深究的必要。如果以后有必要的话,一定会深究到底。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: