您的位置:首页 > 其它

汇编语言--段

2013-08-03 21:32 155 查看
汇编学了好久了,最近在看Linux0.12内核的时候,发现对汇编没有什么感觉,还有对一些定时器的编程,看不太懂。闲来无事,复习复习简单的汇编。

这个程序只有代码段,使用end标号来定位程序开始运行的地址。

所以,在这里,end标号的作用有两个:

1:通知编译器程序什么时候结束

2:通知编译器程序的入口在什么地方

assume cs:code
code segment
dw 0001,0001,0001,0001,0001,0001,0001,0001
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

在单任务系统中,可执行文件的执行过程如下:

1:由其他的程序(debug、command)将可执行文件载入内存;

2:设置CS、IP指向程序的第一条要执行的指令(即程序的入口),从而使程序得以运行。

3:程序运行结束后,返回至加载者

注:在使用debug的时候,会发现程序时ip指向的指令并不是合法的指令,这是因为代码段存储的是数据,我们需要使用R命令修改ip的值,使它指向程序运行的第一条指令。

现在改进一下程序,给程序增加一个栈,放在代码段中。通过栈,使得上一个程序段中定义的字形数组逆序排列。

assume cs:code
code segment
dw 0001,0002,0003,0004,0005,0006,0007,0008
;用dw定义8个字形数据
;在程序加载后,将取得8个字的内存空间,作为后面的程序栈来使用。
dw 0,0,0,0,0,0,0,0
start:
mov ax,cs
mov ss,ax
mov sp,32
mov bx,0
mov cx,8
s:
push cs:[bx]
add bx,2
loop s

mov bx,0
mov cx,8
s0:
pop cs:[bx]
add bx,2
loop s0
mov ax,4c00h
int 21h
code ends
end

我们在源程序中使用assume指令将cs、ds和ss分别和code、data、stack相连后,并没有让cs指向代码段,ss指向堆栈段。注意,assume是伪指令,是由编译器执行的,cpu并不知道他们。所以我们需要在代码中分别给cs、ss和ds赋值。

注意:在8086中,不允许将一个数值直接赋值给段寄存器。所以在程序开始时初始化代码段寄存器的时候,我们应该使用

mov ax,cs
mov ss,ax

而不是使用

mov ds,data
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: