汇编语言[王爽]-06 包含多个段的程序【栈段】
在代码段中使用数据
可以写出下面的程序
assume cs:code
code segment
dw 0123h,0456h,0789h,0abch,0cedfh,0fedh,0cbah,0987h
mov bx,0
mov ax,0
mov cx,8
s:
add ax,cs:[bx]
add bx,2
loop s
mov ax,4c00h
int 21h
code ends
end
dw
: definite word
但是程序是从 代码段的第16个字符开始的, 所以要执行程序,必须要在debug中设置 ip=10
h
如何指定程序的开始部分呢: start
assume cs:code
code segment
dw 0123h,0456h,0789h,0abch,0cedfh,0fedh,0cbah,0987h
start: ;程序从这里开始
mov bx,0
mov ax,0
mov cx,8
s:
add ax,cs:[bx]
add bx,2
loop s
mov ax,4c00h
int 21h
code ends
end start ;在这里结束
程序框架
在代码段中使用栈
assume cs:code
code segment
dw 0123h,0456h,0789h,0abch,0cedfh,0fedh,0cbah,0987h
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
;定义16个字型数据当栈使用
start:
mov ax,cs
mov ds,ax
mov ax,cs
mov ss,ax
mov sp,30h
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
为什么 sp=30h
栈空间 cs:0010h ~ cs:002fh
002fh + 1 = 0030fh
小测:栈空时sp = 栈低地址+栈容量 【注意数据类型】
将数据、代码、栈放入不同的段
之前我们定义了数据段和代码段,现在引入栈段即可
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 ;设置栈顶ss:sp指向stack:20
mov ax,data
mov ds,ax ;ds指向data段
mov bx,0 ;ds:bx指向data段的一个单元
mov cx,8
s:
push [bx]
add bx,2
loop s ;以上将data段中的0-15单元中的8个字型数据依次入栈
mov bx,0
s0:
pop [bx]
add bx,2
loop s0 ;以上依次出栈八个字型数据到data的0-15单元中
mov ax,4c00h
int 21h
code ends
end start
汇编程序如何确定把哪一个段看做数据、代码、栈?
首先不是通过 assume
因为这是伪指令,给编译器看的,并不存在对应的机器码,执行时就不在了,所以是通过 汇编指令
指明的
end start
指明了程序的入口,start,而start是在code段里,所以该段看做是代码mov ds,data
(该指令仅表达意思,实际上不能直接给段寄存器传立即数),把data段的地址传给ds段存器,所以data段看做是数据mov ss,stack
同理,stack段看做是栈