• 汇编语言——包含多个段的程序


    多个段在一起

    问题:利用栈,将程序中定义的数据段数据逆序存放。

     1 assume cs:codesg    ; 定义代码段的位置(codesg的值就是cs寄存器的值)
     2 codesg segment
     3     dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
     4     ; dw(define word)的含义是定义字型数据,db->定义字节型数据
     5     ; 由于我们是在代码段定义的这些数据,所以这些数据是在代码段的(即(cs)=(ds))
     6     dw 0,0,0,0,0,0,0,0      ; 用dw定义了一个栈段
     7 start:  mov ax,cs
     8         mov sp,32    ; 栈段+数据段一共16个字(占内存空间0~31),栈底=最高位+1
     9         mov cx,8
    10      s: push cs:[bx]
    11         add bx,2
    12         loop s
    13         
    14         mov bx,0
    15         mov cx,8
    16      s0:pop cs:[bx]
    17         add bx,2
    18         loop s0
    19         mov ax,4c00h
    20         int 21h
    21 codesg ends
    22 end start    ; start的作用:1.决定代码的开始位置,2.程序结束

    由于是在代码段定义的数据和栈所以他们都在一起会显得很乱。不信你看下面的题就知道了

    将数据、代码、栈放入不同的段

    将各个段全部放在一起主要有两个问题:
    (1)把它们放到一个段中使程序显得混乱;
    (2)前面程序中处理的数据很少,用到的栈空间也小,加上没有多长的代码,放到一个段里面没有问题。

    所以我们要将他们放进不同的段

    我也不知道我写的是啥,反正有用。

     1 assume cs:code,ds:data,ss:stack      ; 定义代码段,数据段,栈段
     2 data segment 
     3     dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h,后面8个0
     4 data ends     ; 数据段结束
     5 
     6 stack segment
     7     dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0      ; 16个字
     8 stack ends      ; 栈段结束
     9     
    10 code segment
    11 start:  mov ax,stack    ; 将CPU分配给栈段的地址赋值给ax寄存器
    12         mov ss,ax        ; 然后在赋值给ss栈段寄存器
    13         mov sp,20h        ; 将栈顶指针设置在32的位置
    14         
    15         mov ax,data
    16         mov ds,ax        ; ds指向data段
    17         mov bx,0        ; 将ds[bx]指向data段的第一个单元
    18         
    19         mov cx,8        ; 循环8次
    20      s :push [bx]        ; 将数据段的第0个值push进栈段
    21         add bx,2        ; 因为一个字2字节
    22         loop s            ; 将data段的8个字,依次入栈
    23         
    24         mov cx,8
    25      s0:pop [bx]        ; 此时(bx)=16,将栈中数据pop出放进数据段内存单元=16中
    26         add bx,2
    27         loop s0            ; 出栈8个字,依次放进16~31内存单元中
    28         
    29         mov ax,4c00H
    30         int 21H
    31         
    32 code ends   ; 代码段结束
    33 end start
  • 相关阅读:
    阿铭每日一题 day 1 20180111
    计算机网络之基础链路
    android学习笔记 对话框合集
    android 音乐播放器简单实现
    Service的生命周期&Service绑定方法
    android学习笔记 Service
    android学习笔记 activity生命周期&任务栈&activity启动模式
    android 短信助手demo
    android 显示意图
    java 多线程断点下载demo
  • 原文地址:https://www.cnblogs.com/x54256/p/8093349.html
Copyright © 2020-2023  润新知