汇编语言学习笔记——第六章 包含多个段的程序

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

下例通过入栈出栈的操作,将0123h,0456h,0789h,0abch 四个数值进行转移。

assume ds:a,cs:b,ss:c       ;分别将a/b/c三段与寄存器ds/cs/ss相关联

a segment
    dw 0123h,0456h,0789h,0abch
a ends                      

c segment
    dw 0,0,0,0
c ends

b segment
d:  mov ax,c
    mov ss,ax
    mov sp,20h          ;将c段地址送进ss,把c段当作栈空间,ss:sp(栈顶)指向C:20

    mov ax,a
    mov ds,ax           ;将a段地址传入ds

    mov bx,0            ;ds:bx指向a段的第一个单元
    mov cx,4
s:  push [bx]           ;将a段中的数值逐个进栈
    add bx,2
    loop s

    mov bx,0
    mov cx,4
s0: pop [bx]            ;将栈内的数值逐个出栈到a段单元中
    add bx,2
    loop s0

    mov ax,4c00h
    int 21h
b ends

end d           ;表示程序入口为标志d

程序解析:

(1)dw
dw(define word)的含义是定义字型数据,在上例中定义了4个字型数据,所占内存8个字节。

扩展补充:
– db定义字节类型变量,一个字节数据占1个字节单元,读完一个,偏移量加1
– dw定义字类型变量,一个字数据占2个字节单元,读完一个,偏移量加2
– dd定义双字类型变量,一个双字数据占4个字节单元,读完一个,偏移量加4

(2)对段地址的引用
mov ax,data
mov ds,ax

在程序中,段名就相当于一个标号,其代表了段地址。

错误:
mov ds,data
mov bx,ds:[6]       ;不能直接将data代表的段地址直接传进ds中

(3)入口与终点
start: ...
    ...
    ...
end start

标志start为程序的入口,当程序运行时从start处开始

ptr(指针)

dword 双字 就是四个字节

ptr pointer缩写 即指针

[]里的数据是一个地址值,这个地址指向一个双字型数据

比如mov eax, dword ptr [12345678] 把内存地址12345678中的双字型(32位)数据赋给eax