首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >(六)汇编语言——包含多个段的程序

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

作者头像
小点点
发布2023-01-01 10:19:08
发布2023-01-01 10:19:08
6800
举报
文章被收录于专栏:小点点小点点

目录

使用数据

使用栈

分段 

代码

总结


使用数据

        首先,我们来看一个问题,就是编程计算0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H的和,结果存在ax寄存器中。看起来还是比较简单的,用简单的加法指令可以完成,但是这样会有一个问题,就是我们的程序和代码就是混在一起的,不仅导致程序混乱,也让人难以理解。         我们在使用C语言的时候,知道可以定义一个数组来解决这样的问题,但是在汇编中也没有数组啊,这可怎么办,别急,我们自有办法,那就是代码段。

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

代码语言:javascript
复制
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:字样,说明现在数据段和代码段已经分开了。到此,数据段的问题已经解决了,加下来我们来看栈段的使用。

代码语言:javascript
复制
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

使用栈

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

代码语言:javascript
复制
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

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

分段 

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

代码

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

代码语言:javascript
复制
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

总结

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-12-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用数据
  • 使用栈
  • 分段 
    • 代码
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档