zoukankan      html  css  js  c++  java
  • 更灵活的定位内存地址的方法05 零基础入门学习汇编语言36

    第七章:更灵活的定位内存地址的方法05

     

    让编程改变世界

    Change the world by program


     

    问题7.8

      [codesyntax lang="asm"]
    assume cs:codesg,ds:datasg
    datasg segment
    db 'ibm             '
    db 'dec             '
    db 'dos             '
    db 'vax             '
    datasg ends
    
    codesg segment
    start: mov ax,datasg
           mov ds,ax
           mov bx,0
    
           mov cx,4
       s0: mov si,0
           mov cx,3
        s: mov al,[bx+si]
           and al,11011111b
           mov [bx+si],al
    
           inc si
    
           loop s
    
           add bx,16
           loop s0
    
           mov ax,4c00h
           int 21h
    codesg ends
    end start
    [/codesyntax] 仔细阅读上面的程序,看看有什么问题? 思考后请听小甲鱼分析!  

    问题7.8分析

      问题在于cx的使用,我们进行二重循环,却只用了一个循环计数器,造成在进行内层的时候覆盖了外层循环的循环计数值。 多用一个计数器又不可能,因为loop指令默认cx为循环计数器。 怎么办呢?   我们应该在每次开始内层循环的时候,将外层循环的cx中的数值保存起来,在执行外层循环的loop指令前,再恢复外层循环的cx数值。 我们可以用寄存器dx来临时保存cx中的数值。 看看我们改进后的程序下载源代码)   上面的程序用dx来暂时存放cx中的值。如果在内层循环中,dx寄存器也被使用,该怎么办? 我们似乎可以使用别的寄存器,但是CPU中的寄存器数量毕竟是有限的,如8086CPU只有14个寄存器。 在上面的程序中:

    si、cx、ax、bx,显然不能用来暂存cx中的值,因为这些寄存器在循环中也要使用;

    cs、ip、ds也不能用,因为cs:ip时刻指向当前指令,ds指向datasg段;

    可用的就只有:dx、di、es、ss、sp、bp等6个寄存器了。   可是如果循环中的程序比较复杂,这些寄存器也都被使用的话,那么该如何? 我们在这里讨论的问题是,程序中经常需要进行数据的暂存,我们怎样做将更为合理。 这些数据可能是寄存器中的,也可能是内存中的。 我们可以用寄存器暂存它们,但是这不是一个一般化的解决方案,因为寄存器的数量有限,每个程序中可使用的寄存器都不一样。   我们希望寻找一个通用的方案,来解决这种在编程中经常会出现的问题。 显然,我们不能选择寄存器,那么可以使用的就是内存了。 我们可以考虑将需要暂存的数据放到内存单元中,需要使用的时候,再从内存单元中恢复。这样我们就需要开辟一段内存空间。 一起来看再次改进的程序下载源代码)   改造后的程序中,用内存单元来保存数据。可是上面的作法却有些麻烦,因为如果需要保存多个数据的时候,读者必须要记住数据放到了哪个单元中,这样程序容易混乱。 我们使用内存来暂存数据,这一点是确定了的,但是值得推敲的是,我们用怎样的结构来保存这些数据,而使得我们的程序更加清晰,更容易读懂和被接受?  

    我们来参考VC编译器的做法!

    一般来说,在需要暂存数据的时候,我们都应该使用栈,回忆一下,栈空间在内存中,采用相关的指令,如:push、pop等,可对其进行特殊的操作。 我们将再次改进我们的程序 !(下载源代码) [buy] 获得所有教学视频、课件、源代码等资源打包 [/buy] [Downlink href='http://kuai.xunlei.com/d/LVXVYMZRPZLE']视频下载[/Downlink]
  • 相关阅读:
    有关base64编码算法的相关操作
    不宜多吃的十种垃圾食品
    ~ 無 淚 的 天 使 ~
    Datagrid 中添加ComboBox 的两种方法(winform)
    刀兄写的IIS管理类(C#)
    17种常用正则表达式
    正则表达式经典 (转)
    C#中Pinvoke的使用
    C#中Pinvoke的使用2
    异步操作样本
  • 原文地址:https://www.cnblogs.com/LoveFishC/p/3846993.html
Copyright © 2011-2022 走看看