汇编语言——包含多个段的程序
多个段在一起
问题:利用栈,将程序中定义的数据段数据逆序存放。
1 assume cs:codesg ; 定义代码段的位置(codesg的值就是cs寄存器的值) 2 codesg segment 3 dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h 4 ; dw(define word)的含义是定义字型数据,db->定义字节型数据 5 ; 由于我们是在代码段定义的这些数据,所以这些数据是在代码段的(即(cs)=(ds)) 6 dw 0,0,0,0,0,0,0,0 ; 用dw定义了一个栈段 7 start: mov ax,cs 8 mov sp,32 ; 栈段+数据段一共16个字(占内存空间0~31),栈底=最高位+1 9 mov cx,8 10 s: push cs:[bx] 11 add bx,2 12 loop s 13 14 mov bx,0 15 mov cx,8 16 s0:pop cs:[bx] 17 add bx,2 18 loop s0 19 mov ax,4c00h 20 int 21h 21 codesg ends 22 end start ; start的作用:1.决定代码的开始位置,2.程序结束
由于是在代码段定义的数据和栈所以他们都在一起会显得很乱。不信你看下面的题就知道了
将数据、代码、栈放入不同的段
将各个段全部放在一起主要有两个问题:
(1)把它们放到一个段中使程序显得混乱;
(2)前面程序中处理的数据很少,用到的栈空间也小,加上没有多长的代码,放到一个段里面没有问题。
所以我们要将他们放进不同的段
我也不知道我写的是啥,反正有用。
1 assume cs:code,ds:data,ss:stack ; 定义代码段,数据段,栈段 2 data segment 3 dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h,后面8个0 4 data ends ; 数据段结束 5 6 stack segment 7 dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; 16个字 8 stack ends ; 栈段结束 9 10 code segment 11 start: mov ax,stack ; 将CPU分配给栈段的地址赋值给ax寄存器 12 mov ss,ax ; 然后在赋值给ss栈段寄存器 13 mov sp,20h ; 将栈顶指针设置在32的位置 14 15 mov ax,data 16 mov ds,ax ; ds指向data段 17 mov bx,0 ; 将ds[bx]指向data段的第一个单元 18 19 mov cx,8 ; 循环8次 20 s :push [bx] ; 将数据段的第0个值push进栈段 21 add bx,2 ; 因为一个字2字节 22 loop s ; 将data段的8个字,依次入栈 23 24 mov cx,8 25 s0:pop [bx] ; 此时(bx)=16,将栈中数据pop出放进数据段内存单元=16中 26 add bx,2 27 loop s0 ; 出栈8个字,依次放进16~31内存单元中 28 29 mov ax,4c00H 30 int 21H 31 32 code ends ; 代码段结束 33 end start