现在的位置: 首页 > 综合 > 正文

汇编语言–段

2013年08月22日 ⁄ 综合 ⁄ 共 1018字 ⁄ 字号 评论关闭

汇编学了好久了,最近在看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


【上篇】
【下篇】

抱歉!评论已关闭.