包含多个段的程序
下面将知识点总结如下:
一、如何累加给定的数值数据?
1、首先要将数据存储在连续内存单元中,但我们不能自己随便决定哪段空间是可以使用的,要让系统为我们分配
可以用dw命令存储数据,此时编译链接后cs:0的值指向数据首地址,如:
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
其中dw定义了8个字型数据,占内存空间大小为16个字节,代码段偏移地址为0,2,4,6……,即CS:0,CS:2,CS:4,CS:6……
用寄存器bx累加时注意应每次加2
2、因为cs前16个内存单元用来存放数据,所以程序应从这16个内存单元后开始执行
具体:1.用start:放在程序开始处
2.在最后一个end处加上start(start只是标号,也可以自定字符)
end除了通知编译器程序结束,还通知编译器程序的入口在什么地方
end start指明程序的入口,被转化为入口地址,存储在可执行文件的描述信息中,加载时程序从描述信息中读到入口地址,设置CS:IP
二、在代码段中使用栈
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,0(16个字型数据作为栈段)
将CS:10~CS:2F内存单做栈来用,SS:SP指向栈底CS:30
dw既可定义数据,也可以说用它开辟内存空间
三、将数据、代码、栈放入不同的段
产生原因:1.开辟数据和段使得程序混乱
2.一个段容量不能大于64KB
assume cs:code,ds:data,ss:stack
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
注意:
1、不同段要有不同段名
2、段名相当于一个标号,代表了段地址,是数字形式而非寄存器形式,所以 mov ds,data错误
3、assume是伪指令,cs:code,ds:data,ss:stack,不会将相应寄存器和段code、stack、data链接