zoukankan      html  css  js  c++  java
  • 包含多个段的程序01 零基础入门学习汇编语言29

    第六章:包含多个段的程序01

     

    让编程改变世界

    Change the world by program


     

    引言

      前面我们写的程序中,只有一个代码段。 现在有一个问题是: 如果程序需要用其他空间来存放数据,我们使用哪里呢? 第5章中,我们讲到要使用一段安全的空间,我们说0:200~0:300是相对安全的。 可这段空间的容量只有256个字节,如果我们需要的空间超过256个字节该怎么办呢? 放心,系统妈妈会给的。怎么给呢?我们粗略地讲下,但这不是必须要会的,听过就行。   对于使用多个段的问题,我们先简单说到这里,下面我们将以这样的顺序来深入地讨论多个段的问题: (1)在一个段中存放数据、代码、栈,我们先来体会一下不使用多个段时的情况; (2)将数据、代码、栈放入不同的段中。  

    在代码段中使用数据

      考虑这样一个问题,编程计算以下8个数据的和,结果存在ax 寄存器中:

    0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H。

      在前面的课程中,我们都是累加某些内存单元中的数据,并不关心数据本身。 可现在我们要累加的就是已经给定了数值的数据。 [codesyntax lang="asm"]
    assume cs:codesg
    
    codesg 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
    codesg ends
    
    end
    [/codesyntax] 解释一下,程序第一行中的 “dw”的含义是定义字型数据。dw即define word。 在这里,我们使用dw定义了8个字型数据(数据之间以逗号分隔),它们所占的内存空间的大小为16个字节。   程序中的指令就要对这8个数据进行累加,可这8个数据在哪里呢? 由于它们在代码段中,程序在运行的时候CS中存放代码段的段地址,所以我们可以从CS中得到它们的段地址。   这8个数据的偏移地址是多少呢? 因为用dw定义的数据处于代码段的最开始,所以偏移地址为0,这8 个数据就在代码段的偏移0、2、4、6、8、A、C、E处。 程序运行时,它们的地址就是CS:0、CS:2、CS:4、CS:6、CS:8、CS:A、CS:C、CS:E。(待上机验证……) 程序中,我们用bx存放加2递增的偏移地址,用循环来进行累加。 在循环开始前,设置(bx)=0,cs:bx指向第一个数据所在的字单元。 每次循环中(bx)=(bx)+2,cs:bx指向下一个数据所在的字单元。 我们将前面的程序6.1编译、连接为可执行文件p61.exe,先不要运行,我们用debug加载查看一下。 [codesyntax lang="asm"]
    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
    [/codesyntax] 来,我们上鸡去!!   如何让这个程序在编译后可以存系统中直接运行呢? 我们可以在源程序中指明界序的入口所在,具体做法见下面的程序6.2。 [codesyntax lang="asm"]
    assume cs:codesg
    
    codesg segment
            dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
    start:  mov bx,0
            mov ax,0
            mov cx,8
    s:      add ax,cs:[bx]
            add bx,2
            loop s
    
            mov ax,4c00h
            int 21h
    codesg ends
    
    end start
    [/codesyntax] 注意在程序6.2中加入的新内容,我们在程序的第一条指令的前面加上了一个标号start,而这个标号在伪指令end的后面出现。  

    探讨end的作用:

    end 除了通知编译器程序结束外,还可以通知编译器程序的入口在什么地方。 有了这种方法,我们就可以这样来安排程序的框架: assume cs:code

    code segment : 数据 : start: : 代码 : code ends

    end start [buy] 获得所有教学视频、课件、源代码等资源打包 [/buy] [Downlink href='http://kuai.xunlei.com/d/LTHPFWDNSEXF']视频下载[/Downlink]
  • 相关阅读:
    学生数据增删改查--顺序表
    应用3+2mvc第一次作业
    双色球随机选【代码】
    字符串穷举
    使用nuget发布自己的包
    VS CODE中配置JAVA格式化细节
    反射的理解(含一点xml)
    UdpClient实现udp消息收发
    c#背包问题代码
    利用TcpClient,简单的tcp消息收发
  • 原文地址:https://www.cnblogs.com/LoveFishC/p/3846008.html
Copyright © 2011-2022 走看看