汇编语言(第三版,王爽)读书笔记
包含多个段的程序
在代码段中使用数据
dw:即“define word”定义字型数据,存放在代码段中(CS)
示例程序
assume cs: code
code segment
dw 0123h, 0456h, 0789h, 0abch, 0defh, Ofedh, 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
在程序中,dw定义的数据处于代码段的最开始,所以偏移地址为0。
加入dw后,要使用标号start将cs:ip指向第一条指令。
在代码段中使用栈
assume cs: codesg
codesg segment
dw 0123h, 0456h, 0789h, 0abch, 0de fh, Ofedh, Ocbah, 0987h
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;用dw定义16个字型数据,在程序加载后,将取得16个字的内存空间,存放这16个数据。在后面的程序中将这段空间当作栈来使用
start: mov ax, cs
mov ss, ax
mov sp, 30h ;将设置栈顶ss:sp指向cs:30
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单元中
mov ax, 4c00h
int 21h
codesg ends
end start
将数据、代码、栈放入不同的段
把它们放在在一个代码段中使程序显得混乱
使用如下方式:
assume cs:code,ds:data,ss:stack
data segment
数据...
data ends
stack segment
栈空间...
stack ends
code segment
start:
代码...
code ends
end start
-
对于不同的段,使用不同的段名
-
不能直接使用
mov ds: data
不能直接将一个数值送入段寄存器中 -
assume cs:code,ds:data,ss:stack
仅仅是在源程序存在的信息,程序中需要使用例如mov ax,stack
和mov ss,ax
的语句来设置寄存器