(六)汇编语言——包含多个段的程序

目录

使用数据

使用栈

分段 

代码

总结


使用数据

        首先,我们来看一个问题,就是编程计算0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H的和,结果存在ax寄存器中。看起来还是比较简单的,用简单的加法指令可以完成,但是这样会有一个问题,就是我们的程序和代码就是混在一起的,不仅导致程序混乱,也让人难以理解。

        我们在使用C语言的时候,知道可以定义一个数组来解决这样的问题,但是在汇编中也没有数组啊,这可怎么办,别急,我们自有办法,那就是代码段。

        我们把数据独立出来,这样的程序就简单明了了,而且也没有安全风险,看起来似乎不错,但是。我们来看看编译后这段代码是什么样的吧! 值得一体的是:dw定义一个字,db定义一个字节,dd定义一个双字

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

        当我们简单编译一下后发现,里面代码全乱套了,这是为什么呢?原因就在于我们定义的数据段 。代码直接从数据段开始编译了,才导致这样的结果,那我们这么解决这个问题呢?

        很清楚的看到,第一行是数据。 

        接下来,我们修改一下我们的代码如下。我们可以看到,在代码段前面添加了start:字样,说明现在数据段和代码段已经分开了。到此,数据段的问题已经解决了,加下来我们来看栈段的使用。

assume cs:code
code segment
	dw 0123H,0456H,0789H,0abcH,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

使用栈

       接下来我们来看另外一个问题:完成下面的程序,利用栈,将程序中定义的数据逆序存放。使用栈的话,我们首先有一种想法,就是定义一段空的空间出来把它当成栈不就好了,于是我们得到以下代码。

assume cs:code
codesg 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

start:mov ax,cs
	mov ss,ax
	mov sp,30h
	mov ax,30h

	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
codesg ends
end start

        到此,我们也算简单的使用了以下栈了。 

分段 

        这样虽然可行,但是程序这样显得混乱,编程和阅读时都要注意何处是数据,何处是栈,何处是代码。根据我们定义数据段的方法,大家也应该猜到了,我们可以再定义一个栈段来存放栈,说干就干,我们看代码。

代码

        代码,栈,数据,各司其职,每个人都有自己的位置,到目前为止,一段完整的代码已经被我们敲出来了。 

data segment
	dw 0123H,0456H,0789H,0abcH,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,data
	mov ds,ax

	mov bx,0
	mov cx,8
  s:push [bx]
	add bx,2
	loop s

	mov bx,0
	mov cx,8
 s0:pop [bx]
	add bx,2
	loop s0

	mov ax,4c00h
	int 21h
code ends
end start

总结

        已经可以敲出一段相对完整的代码了,再接再厉!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值