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]
  • 相关阅读:
    [Luogu P3626] [APIO2009] 会议中心
    杭电 1869 六度分离 (求每两个节点间的距离)
    杭电 1874 畅通工程续 (求某节点到某节点的最短路径)
    最短路径模板
    杭电 2544 最短路径
    POJ 1287 Networking (最小生成树模板题)
    NYOJ 1875 畅通工程再续 (无节点间距离求最小生成树)
    POJ 2485 Highways (求最小生成树中最大的边)
    杭电 1233 还是畅通工程 (最小生成树)
    杭电 1863 畅通工程 (最小生成树)
  • 原文地址:https://www.cnblogs.com/LoveFishC/p/3846986.html
Copyright © 2011-2022 走看看