(三)包含多个段的程序

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 是错误的,不允许将一个数直接送入段寄存器中。


推荐阅读更多精彩内容

  • 8086汇编 本笔记是笔者观看小甲鱼老师(鱼C论坛)《零基础入门学习汇编语言》系列视频的笔记,在此感谢他和像他一样...
    Gibbs基阅读 34,415评论 8 111
  • 王爽汇编全书知识点大纲 第一章 基础知识 机器语言 汇编语言的产生 汇编语言的组成 存储器 cpu对存储器的读写 ...
    2c3ba901516f阅读 1,800评论 0 1
  • 计算机通过执行指令序列来使机器得以工作,所以对于每一系列的计算机都有指定的一组指令集供计算机使用,这组指令...
    未来科技工作室阅读 6,866评论 1 10
  • 一、温故而知新 1. 内存不够怎么办 内存简单分配策略的问题地址空间不隔离内存使用效率低程序运行的地址不确定 关于...
    SeanCST阅读 7,447评论 0 27
  • 汇编总结 汇编的发展史 机械语言 由0和1组成的机器指令(如:0101 0001 1101 0110) 汇编语言(...
    iChuck阅读 1,169评论 1 8