本文主要是介绍汇编语言05——包含多个段的程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
整理自fishcc论坛
安全的空间
通常来说,0:200~0:300这段空间是相对安全的,操作系统通常不会去占用
但这只有256个字节,当需要更多空间时,可以向操作系统申请
问题:
编程计算以下8个数据的和,结果存在ax 寄存器中:
0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H
程序:
assume cs:codesgcodesg 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 21h codesg endsend
程序中的指令就要对这8个数据进行累加,可这8个数据在哪里呢?
由于它们在代码段中,程序在运行的时候CS中存放代码段的段地址,所以我们可以从CS中得到它们的段地址。
这8个数据的偏移地址是多少呢?
因为用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。(待上机验证……)(无法正常运行的...木有入口)
程序中,我们用bx存放加2递增的偏移地址,用循环来进行累加。
在循环开始前,设置(bx)=0,cs:bx指向第一个数据所在的字单元。
每次循环中(bx)=(bx)+2,cs:bx指向下一个数据所在的字单元。
我们将前面的程序6.1编译、连接为可执行文件p61.exe,先不要运行,我们用debug加载查看一下。
程序第一行中的 “dw”的含义是定义字型数据。dw即define word。
在这里,我们使用dw定义了8个字型数据(数据之间以逗号分隔),它们所占的内存空间的大小为16个字节。
如何让这个程序在编译后可以存系统中直接运行呢?
我们可以在源程序中指明界序的入口所在,具体做法见下面的程序6.2。
assume cs:codesgcodesg segmentdw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
start: mov bx,0mov ax,0mov cx,8
s: add ax,cs:[bx]add bx,2loop smov ax,4c00hint 21h
codesg endsend start
注意在程序6.2中加入的新内容,我们在程序的第一条指令的前面加上了一个标号start,而这个标号在伪指令end的后面出现。
探讨end的作用:
end 除了通知编译器程序结束外,还可以通知编译器程序的入口在什么地方。
有了这种方法,我们就可以这样来安排程序的框架:
assume cs:code
code segment
:
数据
:
start:
:
代码
:
code ends
end start
这篇关于汇编语言05——包含多个段的程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!