1.在代码段中使用数据
assume cs:code code segment dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h mov bx,0 mov ax,0 movcx,9 s:addax,cs:[bx] add bx,2 loop s mov ax,4c00h int 21h code ends end
dw的含义是定义字型数据(define word),使用dw定义 了8个字型数据,他们所占的内存空间大小为16个字节。
代码段偏移地址为0,2,4,6……,即CS:0,CS:2,CS:4,CS:6……CS:E。
程序中,用bx存放加2递增的偏移地址,用循环来进行累加。在循环开始前,设置(bx)=0,cs:bx指向第一个数据所在的字单元。每次循环中(bx)=(bx)+2,cs:bx指向下一个数据所在单元。
1.用start:放在程序开始处
2.在最后一个end处加上start(start只是标号,也可以自定字符)
end除了通知编译器程序结束,还通知编译器程序的入口在什么地方
end start指明程序的入口,被转化为入口地址,存储在可执行文件的描述信息中,加载时程序从描述信息中读到入口地址,设置CS:IP
程序框架:
assume cs:code code segment .....数据 start .....代码 code ends end start
2.在代码段中使用栈
assume cs:codesg codesg segment dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h ;用dw定义16个字型数据,在程序加载后,将取得16个字的内存空间,0~f,存放这16个数据 dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;在此处预留了32个字节作为栈,10~2f,在后面的程序将这段空间当作栈来使用 start: mov ax,cs mov ss,ax mov sp,30h ;将栈顶ss:sp指向cs:30h mov bx,0 mov cx,8 s: push cs:[bx] add bx,2 loop s ;将代码段0~15单元的8个字型数据依次入栈 mov bx,0 mov cx,8 s0: pop cs:[bx] add bx,2 loop s0 ;依次出栈8个字型数据到代码段0~15单元中 codesg ends end start
我们将cs:10~cs:2F的内存空间当作栈来用,初始状态下为空,所以ss:sp要指向栈底,即cs:30h。
3.将数据、代码、栈放入不同的栈
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链接