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

    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
  • 相关阅读:
    LeetCode Path Sum II
    LeetCode Longest Palindromic Substring
    LeetCode Populating Next Right Pointers in Each Node II
    LeetCode Best Time to Buy and Sell Stock III
    LeetCode Binary Tree Maximum Path Sum
    LeetCode Find Peak Element
    LeetCode Maximum Product Subarray
    LeetCode Intersection of Two Linked Lists
    一天一个设计模式(1)——工厂模式
    PHP迭代器 Iterator
  • 原文地址:https://www.cnblogs.com/galoishelley/p/3545505.html
Copyright © 2011-2022 走看看