本文主要是介绍8086 汇编笔记(五):包含多个段的程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、在代码段中使用数据
“dw”的含义是定义字型数据
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
code segmentdw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987hmov bx,0mov ax,0mov cx,8s: add ax cs:[bx]add bx,2loop smov ax,4c00hint 21hcode endsend
程序中的指令就要对这8个数据进行累加,可这8个数据在哪里呢?
由于它们在代码段中,程序在运行的时候 CS 中存放代码段的段地址,所以可以从CS 中得到它们的段地址。
它们的偏移地址是多少呢?
因为用 dw 定义的数据处于代码段的最开始,所以偏移地址为 0,这 8个数据就在代码段的偏移 0、2、4、6、8、A、C、E 处。程序运行时,它们的地址就是 CS:0、CS:2、CS:4、CS:6、CS:8、CS:A、CS:C、CS:E。
我们可以在源程序中指明程序的入口所在,具体做法如下
code seqmentdw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987hstart: mov bx,0mov ax,0mov cx,8s: add ax,cs:[bx]add bx,2loop smov ax,4c00hint 21hcode endsend start
我们用 end 指令指明了程序的入口在标号 start 处
二、在代码段中使用栈
codesg segmentdw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987hdw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0start: mov ax,csmov ss,axmov sp,30hmov bx,0mov cx,8s: push cs:[bx]add bx,2loop smov bx,0mov cx,8s0: pop cs:[bx]add bx,2loop s0mov ax,4c00hint 21hcodesg ends
end start
三、将数据、代码、栈放入不同的段
data segmentdw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987hdata endsstack segmentdw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0stack endscode segmentstart: mov ax,stackmov ss,axmov sp,20hmov ax,data ;指令“mov ax,data”的含义就是将名称为“data”的段的段地址送入 axmov ds,axmov bx,0mov cx,8s: push [bx]add bx,2loop smov bx,0mov cx,8s0: pop [bx]add bx,2loop s0mov ax,4c00hint 21hcode endsend start
我们从程序中可明显地看出,定义一个段的方法和前面所讲的定义代码段的方法没有区别,只是对于不同的段,要有不同的段名
这篇关于8086 汇编笔记(五):包含多个段的程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!