汇编语言[王爽]-06 包含多个段的程序【栈段】

在代码段中使用数据

Untitled

可以写出下面的程序

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=10h

如何指定程序的开始部分呢: 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                ;在这里结束

Untitled

程序框架

Untitled

在代码段中使用栈

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 = 栈低地址+栈容量 【注意数据类型】

Untitled

Untitled

将数据、代码、栈放入不同的段

之前我们定义了数据段和代码段,现在引入栈段即可

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段看做是栈
posted @ 2025-09-15 16:03  Miaops  阅读(5)  评论(0)    收藏  举报