美文网首页
(三)包含多个段的程序

(三)包含多个段的程序

作者: SwiftAlan | 来源:发表于2017-07-10 19:47 被阅读0次

Talk is cheap. Show me the code!

assume cs:code,ds:data,ss:stack
data segment
     dw 0123h,0456h,0abch,0987h,0657h,0324h,0523h,0687h
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
        add sp,20h     ; 设置栈顶 ss:sp 指向 stack:20
        mov ax,data
        mov ds,ax
        add bx,0     ; ds:bx 指向 data 段中的第一个单元
        mov cx,8
    s:  push [bx]
        add bx,2      ; 以上将 data 段中的 0~15 单元中的 8 个字数据依次入栈
        loop s
        mov bx,0
        mov cx,8
   s0:  po [bx]
        add bx,2      ; 以上依次出栈 8 个字数据到 data 段的 0~15 单元中
        loop s0
        mov ah, 4ch   ; 退出
        int 21h
code ends
end start

说明:
1、定义多个段的方法
我们从程序中可明显的看出,定义不同的段要有不同的段名。
2、对段地址的引用
程序中有了多个段,如何访问段中的数据呢?当然要通过地址,而地址分为段地址和偏移地址;在程序中段名就相当于一个标号,它代表了段地址,所以指令 mov ax,data 的含义就是将名称为 data 的段的段地址送入 ax,一个段中的段地址可由段名代表,偏移地址就要看它在段中的位置了,程序中 0abdh 的地址就是 data:2 要将它送入 bx 中。
可以用如下代码:

mov ax,data
mov ds,ax
mov bx,ds:[2]

不能用下面的代码:

mov ds,data
mov bx,ds:[2]

因为指令 mov ds,data 是错误的,不允许将一个数直接送入段寄存器中。

相关文章

网友评论

      本文标题:(三)包含多个段的程序

      本文链接:https://www.haomeiwen.com/subject/ztuuhxtx.html