本文主要是介绍4.5 代码段、数据段、栈段,dup指令,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
4.5 代码段、数据段、栈段,dup指令
1. 代码段
1.1 MASM内部以数据位的个数定义了多种数据类型
- byte,db,8位(define byte)
- word,dw,16位(define word)
- dword,dd,32位(define double word)
- qword,dq,64位(define,quadra word)
1.2 dw和db
- 用dw往内存里面存数据时,每一个数占16位,16进制不能以字母开头,如果不足16位会自动往前面补0,高位在前,低位在后,要考虑存取顺序
- 用db往内存里面存数据时,每一个数占8位,每次存两个数,不足两个数补0,不用考虑存取顺序
左边是dw,右边是db,都是数据,下面都是代码,都存放在内存当中
1.3 start标记
- 为了让程序从指定位置开始,用start标记,不然内存里面,数据和代码是一起存的
assume cs:codesg
codesg segmentdw 123h,456h,789h,0abch,0defh //定义字型数据start: //csip地址指向这里,程序从这里开始运行mov ax,3mov cx,11call sinc bxinc bxint 21h
s:add ax,axloop scodesg ends //代码段结束
end start //start开始,start结束
- csip直接指向第一句代码mov ax,3,地址为076a:000a,程序也由这里开始执行
- 数据从076a:0000开始存放,代码从start开始,也就是mov ax,3
2. 将数据、代码、栈放入不同的段
- 如果数据、栈和代码需要的空间超过64KB,就不能放在一个段中(一个段的容量不能大于64KB,这是8086模式的限制)
- 我们要用多个段来存放数据、代码和栈
- 如果我们要存入重复的数据可以用dup指令(duplicate)
db 重复的次数 dup (重复的字节型数据)
- 代码段、栈段和数据段它们的存储空间是连续的,至少占了16个字节
assume cs:codesg,ds:data,ss:stack //代码段,数据段,栈段
data segment //数据段开始db 'hello,world' //可以存放一句话dw 123h,456h,789h,0abch,0defh //定义字型数据db 3 dup (1,2,3) //定义字节型数据,复制3个1,2,3;实际存储:01,02,03,01,02,03,01,02,03db 3 dup ('abc','def') //实际存储abc,def,abc,def,abc,def
data ends //数据段结束stack segment //栈段开始db 10 dup (0) //定义字节数据,复制10个0来开一个栈空间
stack ends //栈段结束codesg segment //代码段开始start: //csip地址指向这里,程序从这里开始运行mov ax,3mov cx,11call sinc bxinc bxint 21h
s:add ax,axloop scodesg ends //代码段结束
end start //start开始,start结束
- 'hello,world’开始存入数据,以ASCII码的形式转入编号
- 紧接着存入数据,然后接着存入字符’abc’,‘def’
- 最后存入10个0来开辟一段栈空间,但是至少占16个字节,所以占了一行,也体现了存储的连续性
- 然后便开始存入代码
这篇关于4.5 代码段、数据段、栈段,dup指令的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!