• [汇编语言]-第六章 包含多个段的程序 在一个段中存放数据,代码,栈


    1- 程序取得所需空间的方法有两种,一是加载程序的时候为程序分配,再就是程序在执行的过程中向系统申请.

    2-在代码段中使用数据

    编程计算以下8个数的和,结果存在ax寄存器中. 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H

     1 assume cs:code
     2 code segment
     3     dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H    ;dw [define word]定义字符型数据
     4     mov bx,0
     5     mov ax,0
     6     mov cx,8
     7   s:add ax,cs:[bx]
     8     add bx,2
     9     loop s
    10     
    11     mov ax,4c00H
    12     int 21h
    13 code ends
    14 end

    如下图程序开始位置为:cs:ip 0B60:0000 但-u查看的代码,我们看不懂,第二图显示代码的开始位置为 0B60:0010,原因是什么呢?

    程序开始 定义dw字符型数据,需要存储, 共8个字,16个字节.所以0B60:0000-0B60:0010存储[0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H],所以程序从0B60:0010开始.

    0B60:0000到0B60:0010之间存储[0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H]

    由以上可得出结论,dw定义的数据,存储从到段的开始0000处 开始存储.

    但执行以上程序,需要把IP修改为0010才能正式执行代码.这样比较麻烦,所以引入start标记.请看以下代码

     1 assume cs:code
     2 code segment
     3     dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H    ;dw [define word]定义字符型数据
     4 start:mov bx,0
     5     mov ax,0
     6     mov cx,8
     7   s:add ax,cs:[bx]
     8     add bx,2
     9     loop s
    10     
    11     mov ax,4c00H
    12     int 21h
    13 code ends
    14 end start

    伪指令end的作用:

    (1) 通知编译器程序结束

    (2) 通知编译器程序的入口 [如上程序的入口在start处,即mov bx,0是程序的第一条指令]

    以上总结: 我们想要CPU从何处开始执行程序,只要在源程序中用"end 标号"指明就可以 

    有了以上方法,我们就可以这样安排程序框架 :

     1 assume cs:code
     2 code segment
     3         .
     4         .
     5         数据
     6         .
     7         .
     8 start:
     9         .
    10         .
    11         代码
    12         .
    13         .
    14 code ends
    15 end start

    在单任务系统中,可执行文件中的程序执行过程如下:

    (1) 由其他程序(Debug, command或其他程序)将可执行程序文件中的程序加载入内存

    (2) 设置CS:IP指向程序的第一条要执行的指令(即程序的入口),从而使得程序得以运行

    (3) 程序运行结束后,返回到加载者

    3- 在代码段中使用栈

    将程序中定义得数据逆序存放

     1 assume cs:code
     2 code segment
     3     dw    0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H
     4     dw    0,0,0,0,0,0,0,0
     5         
     6 start:  mov ax,cs
     7         mov ss,ax
     8         mov sp,32      ;将设置栈顶ss:sp指向cs:32
     9         
    10         mov bx,0
    11         mov cx,8
    12     s:  push cs:[bx]
    13         add bx,2
    14         loop s        ;将以上代码段0-16单元中的8个字符型数据依次入栈
    15         
    16         mov bx,0
    17         mov cx,8
    18     s0: pop cs:[bx]
    19         add bx,2
    20         loop s0        ;以上依次出栈8个字符型数据到代码段0-16单元中
    21         
    22         mov ax,4c00H
    23         int 21h
    24 code ends
    25 end start            ;指名程序的入口在start处

     dw作用:

    (1) 定义数据 dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H

    (2) 开辟内存空间 dw 0,0,0,0,0,0,0,0

    定义了8个字符型数据,也可以说开辟了8个字的内存空间,这段空间中每个字单元的数据依次是:0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H

    实验:

     1 ;下面的程序实现依次使用内存0:0-0:15单元中的内容改写程序中的数据
     2 assume cs:code
     3 code segment
     4     dw  0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H
     5 start:  mov ax,0
     6         mov ds,ax
     7         
     8         mov bx,0
     9         mov cx,8
    10     s:  mov ax,[bx]
    11         mov cs:[bx],ax
    12         add bx,2
    13         loop s
    14         
    15         mov ax,4c00H
    16         int 21h
    17 code ends
    18 end start

     

     1 ;下面的程序实现依次使用内存0:0-0:15单元中的内容改写程序中的数据
     2 ;数据的传送用栈来进行,栈空间设置在程序内.
     3 assume cs:code
     4 code segment
     5     dw    0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H
     6     dw    0,0,0,0,0,0,0,0
     7 start:    mov ax,0
     8         mov ds,ax
     9         
    10         mov ax,cs
    11         mov ss,ax
    12         mov sp,32
    13         
    14         mov    bx,0
    15         mov cx,8
    16     s:  push [bx]            ;内存0:0-0:15单元中的内容 入栈到ss:32
    17         pop cs:[bx]          ;内存0:0-0:15单元中的内容 出栈到cs:0
    18         add bx,2
    19         loop s
    20         
    21         mov ax,4c00H
    22         int 21h
    23 code ends
    24 end start
  • 相关阅读:
    Vue的配置安装与项目创建
    log4j:WARN No appenders could be found for logger
    终于在博客园扎根了
    简单工厂模式
    详解apache防盗链网站图片防盗链方法
    怎样能写好文章标题
    生活需要阿Q精神
    2013个人博客全新起航
    华中师范大学新生网上怎么选宿舍
    华中师范大学2012级新生QQ交流群欢迎加入!
  • 原文地址:https://www.cnblogs.com/galoishelley/p/3545505.html
Copyright © 2020-2023  润新知