汇编教程4--学会解决问题

原创 2004年07月08日 14:15:00

汇编教程4--学会解决问题
  最近真的有点忙,又是c#,又是java,robocode,又是win32asm,
忙得不可开交了,不过教程不能耽误了,毕竟第一次写,有大家给我鼓励,
很知足了。
  不知道上一片你们看得怎么样?看不懂也没关系,慢慢体会,我最开始的时候就看的是一大堆的寄存器,标志位,什么都不懂,如们还花了很多时间的。

  正题。

  一、循环结构:
  1 循环指令。
  格式:loop 指令标号
  功能:将寄存器cx的值减去1。然后判断:如果cx<>0,这转移指令到标号处。否则继续执行后续指令。相当于以下两条指令:
    dec cx
    jnz 指令标号
   
    所以要在循环前先确定循环次数,置入cx中。
    注意:在循环体中不要对cx改写,至于原因我想我不必多说了吧。

    来一段程序:
    设变量var中有10个数据,12,0,-6,44,-54,0,3,51,98,69 统计其中0的个数。

    现在我们学习重在分析了,不像以前重点理解语句。
    10个数据,每个占用一个字节就可以了,那我们怎么样实现数据统计呢?应该用循环。有几个问题:
       怎样逐个读入数据?从一个变量中。
       比较后怎么样统计0的个数?
       会不会重复统计?
    解决了这几个问题这个程序也就出来了。
        第一个问题,对于一个变量里的多个数据的读入,上一章讲过了,这就相当于一个数组,最常用的方法就是利用bx来寻址。
 第二个问题,用一个专门的寄存器,统计0的个数
 第三个问题,其实很简单,关键是不要把这个程序和冒泡法的算法搞混了,这个程序对于全部的数据只要循环一次就可以了。

  ok,写出规划,这个很重要,刚刚学习的最好写一下,尤其是汇编,免得寄存器出错。很难查错的。

        al:保存从变量读入的数据
 bx:间接寻址用
 cx:循环
 dl:计数器,统计0的个数。

data segment
var db 12,0,-6,44,-54,0,3,51,98,69
result db ?
data ends

code segment
     assume cs:code,ds :data
     start:
           mov ax,data
    mov ds,ax
    mov bx,0
    mov dl,0
    mov cx,10   ;上面一堆mov都是为了初始化
     again:
           mov al,[bx+var]
    cmp al,0       
    jnz lab        ;如果不等于0就转lab
    inc dl    ;如果读入的数为0,dl++
       lab:
           inc bx
    loop again
    mov result,dl

    mov ah,4ch
    int 21h
code ends
      end start


    it is a easy job,isn't?
   这里有一个问题,因为前面我说了,10个数据,每个占用一个字节就可以了,那为什么循环计数不用cl或ch?这样不会浪费,别忘了,循环指令的默认操作对象就是cx,不能修改的。

   在设计程序的时候,多注意寄存器的使用,初学者往往对怎么用乱而无序。

   下面,来一段冒泡法的程序,我不解释,不懂的再问。

   data segment
        var db -1,-10,-100,27h,0ah,47h
        n   equ $-var
   data ends

   code segment
        assume cs:code,ds:data
  
   b    mov ax,data
        mov ds,ax
 mov cx,n-1
 mov dx,1

   ag:  call subp     ;调用子程序
        inc dx
 loop ag
 mov ah,4ch
 int 21h
**************************;子程序开始
   subp proc 
        push cx
 mov cx,n
 sub cx,dx
 mov si,0
   recmp:  mov al,var[si]
           cmp al,var[si+1]
    jle noch
    xchg al,var[si+1]
    xchg al,var[si]
   noch:   inc si
           loop recmp
    pop cx            ;
    ret
   subp     endp
   **************************
   code     ends
            end b

 
  有点难度,不过多看看一定会想通的,巩固一下,以后会比较深了。

                                         2003 11月29日凌晨1:33
            sssa2000

简明Python教程学习笔记_5_解决问题

问题 我提出的问题是: 我想要一个可以为我的所有重要文件创建备份的程序。 尽管这是一个简单的问题,但是问题本身并没有给我们足够的信息来解决它。进一步的分析是必需的。例如,我们如何确定该备份哪些文件?...
  • freeking101
  • freeking101
  • 2016年03月22日 22:14
  • 612

十天学会web标准(DIV+CSS)系列(十)div+css网页标准布局实例教程

一、建立站点 前面的课程都是零碎讲解一些相关知识,那么要做一个网站,首先需要建立一个站点。那么什么是站点,为什么要建立一个站点呢?因为网站不同于其它文件,比如一个图片,放到哪个盘哪个目录下都可以访问...
  • jarniyy
  • jarniyy
  • 2016年03月21日 14:46
  • 3893

7天学会spring cloud

7天学会spring cloud教程   按照官方的话说:Spring Cloud 为开发者提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性 To...
  • hxpjava1
  • hxpjava1
  • 2017年06月01日 18:00
  • 174

python简明教程-第十章解决问题-备份文件

需求: 输入需要备份的文件的目录,以及备份文件的存储路径,将备份文件压缩并以日期和时间存档 # --coding:utf-8-- import os import timesource = r'C:\...
  • u010274840
  • u010274840
  • 2016年06月28日 19:49
  • 247

一天学会Git(一)

一、Git安装 Git是一款分布式管理系统,与cvs和svn等集中式版本控制系统不同,Git不需要集中式的版本库,每个人都工作在一个克隆在本地的版本库。也就是说每个人都有一个版本库,日常的提交、创建分...
  • annsheshira23
  • annsheshira23
  • 2015年07月22日 21:35
  • 459

逆向基础---vc汇编(一)

首先介绍我们会经常看到的一些寄存器: 4个数据寄存器(EAX、EBX、ECX和EDX) 2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)     4个数据寄存器(E...
  • songtzu
  • songtzu
  • 2014年07月16日 14:04
  • 940

Maven in 5 Minutes(5分钟学会使用Maven)

Prerequisites(预备知识) You must have an understanding of how to install software on your computer. If ...
  • daven_java
  • daven_java
  • 2013年04月07日 14:39
  • 2564

程序员学会自已解决问题。

程序员学会自已解决问题。 本节重点: l         什么是程序员? ...
  • zjoudeng
  • zjoudeng
  • 2007年05月31日 11:56
  • 309

如何学会解决问题(二)

问题:目前几乎所有的算法书的讲解方式都是欧几里德式的、瀑布式的、自上而下的、每一个推导步骤都是精准制导直接面向目标的。由因到果,定义、引理、定理、证明一样不少,井井有条一丝不乱毫无赘肉。而实际上,这完...
  • qq_36038987
  • qq_36038987
  • 2017年08月23日 13:28
  • 96

学会利用指针解决问题

实验目的:学会利用指针解决问题 实验内容:求出一个数所有的奇数因子 * 程序头部注释开始 * 程序的版权和版本声明部分 * Copyright (c) 2011, 烟台大学计算机学院学生 * All...
  • liucuanfeng
  • liucuanfeng
  • 2012年03月04日 10:15
  • 260
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:汇编教程4--学会解决问题
举报原因:
原因补充:

(最多只允许输入30个字)