• 汇编语言-多个段的程序


    代码展示

    下面代码展示了多段程序,功能是将data中的数据,翻转保存

    assume cs:code, ds:data, ss:stack
    
    data segment
        dw 0123H, 0456H, 0789H, 0abcH, 0defH, 0fedH, 0cbaH, 0987H
    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
        mov sp,20H
    
        mov ax,data
        mov ds,ax
    
        mov bx,0
    
        mov cx,8
    s:  push [bx]
        add bx,2
    loop s
    
        mov bx,0
        mov cx,8
    s2: pop [bx]
        add bx,2
    loop s2
    
        mov ax,4c00H
        int 21H
    code ends
    
    end start
    

    功能介绍:

    定义三个段,然后将stack段,作为堆栈段;将data作为数据段;将code作为代码段。通过代码段中代码,将数据段中数据保存到堆栈段中,然后在pop出来,保存在数据段中。


    知识点介绍

    start:

    code segment
    
    start:  mov ax,stack
        ...
        ...
        ...
    
        mov ax,4c00H
        int 21H
    code ends
    
    end start

    start:

    正如我们之前介绍的标记一样,start也是一样的,表示所在指令段的偏移地址。如同code,表示上面定义代码段的偏移地址。

    end start

    告诉编辑器,在代码段中代码从何处开始。


    assume指令

    assume cs:code是给code段中的标号找了个段寄存器,就这点作用。

    具体看下面论坛:
    http://bbs.csdn.net/topics/350233108


    段及其地址

    在上面代码中,定义了三个段。三个段,分别分别为datastackcode,大概框架如下:

    data segment
        ...
        ...
    data ends
    
    
    stack segment
        ...
        ...
    stack ends
    
    
    code segment
        ...
        ...
    code ends
    

    这里需要说明几点:

    1. 编译连接一开始展示的代码,在debug中调试程序。发现data地址在系统分配内存的最开始,stack地址在data的后面,code段在stack的后面。

    2. 每个段的大小,最少为10H大小。段地址,最少为16的倍数。因此,虽然data段中只填入了两个字单元,但还是占用了16个字节的单元。

    这里写图片描述

  • 相关阅读:
    前后端分离后的前端时代
    解决input[type=file]打开时慢、卡顿问题
    es6快速入门
    jsonp的原理和实现
    减少前端代码耦合
    【css技能提升】css高级技巧
    vetur插件提示 'v-for' directives require 'v-bind:key' directives.错误的解决办法
    ES6的开发环境搭建
    netCore webapi Uow实现方式
    netcore webapi统一配置跨域问题
  • 原文地址:https://www.cnblogs.com/AbeDay/p/5026853.html
Copyright © 2020-2023  润新知