1.为什么要引入不同的段放不同的东西
而且代码和数据本身都是二进制信息
所以代码,数据和栈放入同一个段中无法分清,哪里是数据,哪里是代码
所以我们需要用多个段来放不同的
2.段
段如何定义
Name segment
//内容
Name ends
表示一个段
数据段 把内容变成 dw 0123h,0456h...
栈段 把内容变成 dw 0,0,0,0...
代码段 把内容变成 mov ax,bx...
带来的问题:
这样一来也出现一个问题程序我们把前面的数据段和栈段安排现在前面,程序执行的时候会出错,执行的是我们不希望执行的指令
解决方案
我们的解决方案是用 start 标号来表明程序的入口,并用end start去向编译器指明程序入口,start也可以是别的符号
assume ...
//各个段 在你想要作为开头的段 写入标号start
end start
注:
- dw 是定义字型数据 “define word”
- db 是定义字符数据 “define Byte”
- dd 是定义双字型数据 ''double word"
- dup 是进行数据重复
dw / db / dd 重复的次数 dup (重复的数据)
可以让相同的数据变简短
汇编源代码分析
assume cs:code,ds:data,ss:stack
data segment
dw 0123h,0456h,0abch
data ends
stack segment
dw 0,0,0,0
stack ends
code segment
start: mov ax,code
mov ss,ax
mov sp,8h
mov ax,data
mov ds,ax
mov bx,0
mov cx,3
s: push [bx]
add bx,2
loop s
mov bx,0
mov cx,3
s0: pop [bx]
add bx,2
loop s0
mov ax,4c00
int 21h
code ends
end start
-
mov ax stack 执行到 mov ds,ax
stack 和 data 变成一个地址
stack 的段地址为 076c
data 的段地址为 076a
-
mov sp,4h 并没有去执行 ,sp在执行 mov ss,ax 后就变成了0004
-
执行完第一个入栈循环
如上,从高地址开始向低地址赋值,stack空间多一个,有一个没有变化 -
执行完第二个出栈循环
这里出现了一个问题:
前面我们知道栈的入栈,不改变其他的位置
出栈也不会覆盖原来的,只有再push到这个位置的时候,覆盖
但是这里【 00 00 ss ip A3 01】 这4个字都会来填充这个栈没有元素的,这是让我费解的