zoukankan      html  css  js  c++  java
  • [汇编学习笔记][第六章包含多个段的程序]

    第六章 包含多个段的程序

    程序取得空间的方法有两种

    • 在加载程序的时候为程序分配
    • 程序执行过程向系统申请

    在课程中不讨论第二种(malloc)

    6.1 在代码段使用数据

    从规范的角度,我们是不能自己随便决定那段空间可以使用,应该让系统来为我们分配。在程序中,定义我们希望处理的数据,这些数据会被编译,作为程序的一部分写入可执行文件。当可执行文件被加载入内存时,这些数据也同时被加载入内存中。

    程序6.1

    assume cs:code
    
    code segment
    
        dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
        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
    • dw

    dw 即“define word”定义字型数据(16位)

    程序6.2

    assume cs:code
    
    code segment
    
        dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
        start: mov bx,111H
        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
    • 并没有start这个指令,start并不是保留字符
    • 主要是end的作用,end除了通知编译器程序结束,还可以通知编译器程序的入口在什么地方。这里我们用end制定了入口在标号start的地方,我们也可以制定标号dddd,yyyy。

    6.2 在代码段中使用栈

    代码6.3

    assume cs:code
    
    code segment
    
        dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
        dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0   
        start:
        mov sp,30h
    code ends                                
    end

    解读内存:

    • CS:00- CS:0F 存放数据
    • CS:10- CS:2F 存放栈
    • 所以栈指针初始为CS:30

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

    放入同一段有两个问题

    • 放入同一段,程序显得混乱
    • 如果数据,栈和代码超过64KB,就不能放到一个段里了(X86约束)

    代码6.4

    assume cs:code,ds:data,ss:stack
    
    data segment
    
        dw 0123h,0456h,0789h,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,4c00h
           int 21h
    code ends
    
    end start

    不难想到为什么叫段地址叫做 ds,ss,cs了吗,分别就是

    data segment,stack segment,code segment的缩写

    • 对于mov ax,data的意义

      名称为”data”的段的段地址送入ax。一个段的段地址可以由段名表示

    • 还有几个疑问

      • assume到底有什么实质作用?

        作者说,并不会是cpu的寄存器指向这些段,不必去深究。。暂时也没看到深究的必要。如果以后有必要的话,一定会深究到底。

  • 相关阅读:
    【源码笔记】BlogEngine.Net 中的权限管理
    Asp.Net MVC 分页、检索、排序整体实现
    AngularJS 初印象------对比 Asp.net MVC
    Asp.Net MVC Filter 实现方式和作用范围控制
    上传图片压缩+水印(文字、图片)+验证码
    2014年及五年计划
    【读书笔记】Asp.Net MVC 上传图片到数据库(会的绕行)
    VS2012 生成事件
    CSS position绝对定位absolute relative
    CSS兼容性解决方法!important的IE7,Firefox问题
  • 原文地址:https://www.cnblogs.com/zy691357966/p/5480521.html
Copyright © 2011-2022 走看看