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


    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
  • 相关阅读:
    ArcEngine:GP使用!没道理的错误!
    XMLHttpRequest的亲密接触(1)——简单讲解
    XMLHttpRequest的亲密接触(2.2)——表单提交
    初入Ajax,需要明确的Web工作原理
    文章收藏明细
    【备忘】Oracle10g 创建、删除表空间、创建、授权用户
    proxool的使用总结
    Java操作压缩与解压缩
    解决jquery ui dialog中调用datepicker时日期选择控件被遮挡的问题
    如何读取jar包中的xml等资源文件
  • 原文地址:https://www.cnblogs.com/galoishelley/p/3545505.html
Copyright © 2020-2023  润新知