汇编语言程序设计之统计元素个数

前言

统计元素个数这样的问题,思路其实很简单,用高级语言来实现的话,几行代码就可以搞定,但是如果要用汇编语言来实现的话,代码量会稍微多一些,但解题思路其实是一样的。

题目描述

在内存数据段处存放有10个8位带符号数,其首地址为MEM,试统计其中正元素、负元素和零元素的个数,并分别将个数存入PLUS、MINUS、ZERO这三个单元中。

题目分析

为了实现上述计数功能:

  1. 可先将PLUS、MINUS、ZERO这三个单元清零
  2. 然后将数据段中的数据依次放入AL中
  3. 利用OR指令让操作数自身相或
  4. 再用条件转移指令测试该数是正数、负数还是零
  5. 最后分别在对应的单元中计数。

参考代码

DATA   SEGMENT
       MEM DB 05H,00H,83H,12H,0FAH,77H,0CDH,9BH, 66H,00H                   
       PLUS DB 1 DUP(?)
       MINUS DB 1 DUP(?) 
       ZERO DB 1 DUP(?)
DATA   ENDS
CODE   SEGMENT
       ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
       MOV DS,AX
       XOR AL,AL ;AL清零
       MOV PLUS,AL ;PLUS清零
       MOV MINUS,AL ;MINUS清零
       MOV ZERO,AL ;ZERO清零
       LEA SI,MEM ;数据首地址送入SI
       MOV CL,10 ;数据长度送入CL
       CLD
CHECK: LODSB ;AL←[DS:SI]即取一个数到AL
       OR AL,AL ;操作数自身相“或”,AL内容不变,仅影响标志位
       JS   X1 ;若为负数,即SF=1时转X1
       JZ   X2 ;若为零,即ZF=0时转X2
       INC PLUS ;否则为正,PLUS单元加1
       JMP NEXT
   X1: INC MINUS ;MINUS单元加1
       JMP NEXT
   X2: INC ZERO ;ZERO单元加1
 NEXT: DEC CL ;数据长度CL加1
       JNZ CHECK ;若CL的值不为0即ZF=0则转CHECK
       MOV AH,4CH
       INT 21H
 CODE  ENDS
       END START 

程序使用指令详解

六大标志位

在本程序中,使用OR指令、DEC指令或INC指令时,当条件满足时会使状态标志位发生改变

因此我们需要牢牢记住以下六个状态标志位发生改变的条件

CF——进位标志位

当进行加(减)法运算时,若最高位向前有进(借)位,则CF=1,否则CF=0

PF——奇偶标志位

当运算结果的低8位中1的个数为偶数时PF=1,为奇数时PF=0

AF——辅助进位标志位

在加(减)法操作中,D3向D4有进位(借位)时,AF=1,否则AF=0

DAA指令和DAS指令测试这个标志位,以便在BCD加法或减法之后调整AL中的值

ZF——零标志位

当运算结果为零时,ZF=1,否则ZF=0

SF——符号标志位

当运算结果的最高位为1时SF=1,否则SF=0

OF——溢出标志位

当算数运算的结果超出了带符号数的范围,即溢出时OF=1,否则OF=0

XOR指令

XOR是逻辑运算中的异或指令,其格式为:

XOR OPRD1,OPRD2

两个相同的操作数相异或,能使操作数置零:

XOR AX,AX ;AX 0,使AX清零

OR指令

OR是逻辑运算中的或指令,其格式为:

OR OPRD1,OPRD2

OR指令有下面三种应用:

  • 实现两操作数按位相“或”的运算

OR AX,[DI]

  • 使某些位不变,某些位置“1”

OR CL,0FH

  • 在不改变操作数的 情况下使OF=CF=0

OR AX,AX

LEA——取偏移地址指令

LEA能将存储器操作数的16位偏移地址取出送目标寄存器

当程序中用符号地址表示内存偏移地址时,须使用该指令

指令格式:

LEA REG,MEM

源操作数必须是一个存储器操作数,目标操作数通常是间址寄存器

在这里插入图片描述

LODSB——串装入指令

串装入指令有3种格式:

LODS OPRD

LODSB

LODSW

该用于将内存某个区域的数据串依次装入累加器,以便显示或输出到接口,指令执行后会将[DS:SI]里的值送入AX或AL

条件转移指令

在这里插入图片描述

程序执行过程详解

进入断点调试:
在这里插入图片描述
核心代码从清零3个计数单元开始,首先来看一下初始状态:
在这里插入图片描述
要判断的10个值存放在数据段ds里,紧接着的是PLUS、MINUS、ZERO这三个单元,巧的是这三个单元的初始值为0,为了保险起见,我们需要用代码再给他们清零。

首先让AL变为0,AL是AX的低八位:
在这里插入图片描述
接着把PLUS、MINUS、ZERO这三个单元清零:
在这里插入图片描述
下一步是把要比较的数据取出来,用LEA把数据的偏移地址拿到:
在这里插入图片描述
这里因为偏移地址就是0000,所以没有变化,但其实已经取到了偏移地址

接着就进入了程序的主要部分CHECK。

通过LODSB指令将数据取到AL中,于此同时si指向下一个数据:

在这里插入图片描述
使用OR指令让操作数AL与自身相或,注意看标志位的变化:
在这里插入图片描述
操作数05H与自身相或:

  • 结果无进位:CF=0
  • OR不改变操作数,即结果不为零:ZF=0
  • 05H是正数,第一位为0,所以:SF=0
  • OR运算无溢出,故:OF=0
  • 05H的二进制表示为00000101B,即1的个数为偶数,故:PF=1
  • OR运算无进位或借位,故:AF=0

因为SF=1,所以JS的条件不成立,程序往下执行:
在这里插入图片描述

因为ZF=0,所以JZ的转移条件不成立,程序继续执行,不跳转,PLUS加1:
在这里插入图片描述
此时经过一个无条件转移指令JMP,程序跳转至NEXT处执行:
在这里插入图片描述
外循环次数减1,因为CL没有减到0,运算结果不为0故ZF=0,条件成立,程序跳转到CHECK处执行:
在这里插入图片描述
如此往复循环,直至10个数全部遍历结束为止

已标记关键词 清除标记
第 一 章 概述 1-1 简述计算机程序设计语言的发展历程。 解: 迄今为止计算机程序设计语言的发展经历了机器语言、汇编语言、高级语言等阶段,C++语言是一种面向对象的编程语言,也属于高级语言。 1-2 面向对象的编程语言有哪些特点? 解: 面向对象的编程语言与以往各种编程语言有根本的不同,它设计的出发点就是为了能更直接的描述客观世界中存在的事物以及它们之间的关系。面向对象的编程语言将客观事物看作具有属性和行为的对象,通过抽象找出同一类对象的共同属性(静态特征)和行为(动态特征),形成类。通过类的继承与多态可以很方便地实现代码重用,大大缩短了软件开发周期,并使得软件风格统一。因此,面向对象的编程语言使程序能够比较直接地反问题域的本来面目,软件开发人员能够利用人类认识事物所采用的一般思维方法来进行软件开发。C++语言是目前应用最广的面向对象的编程语言。 1-3 什么是结构化程序设计方法?这种方法有哪些优点和缺点? 解: 结构化程序设计的思路是:自顶向下、逐步求精;其程序结构是按功能划分为若干个基本模块;各模块之间的关系尽可能简单,在功能上相对独立;每一模块内部均是由顺序、选择和循环三种基本结构组成;其模块化实现的具体方法是使用子程序。结构化程序设计由于采用了模块分解与功能抽象,自顶向下、分而治之的方法,从而有效地将一个较复杂的程序系统设计任务分解成许多易于控制和处理的子任务,便于开发和维护。 虽然结构化程序设计方法具有很多的优点,但它仍是一种面向过程的程序设计方法,它把数据和处理数据的过程分离为相互独立的实体。当数据结构改变时,所有相关的处理过程都要进行相应的修改,每一种相对于老问题的新方法都要带来额外的开销,程序的可重用性差。 由于图形用户界面的应用,程序运行由顺序运行演变为事件驱动,使得软件使用起来越来越方便,但开发起来却越来越困难,对这种软件的功能很难用过程来描述和实现,使用面向过程的方法来开发和维护都将非常困难。 1-4 什么是对象?什么是面向对象方法?这种方法有哪些特点? 解: 从一般意义上讲,对象是现实世界中一个实际存在的事物,它可以是有形的,也可以是无形的。对象是构成世界的一个独立单位,它具有自己的静态特征和动态特征。面向对象方法中的对象,是系统中用来描述客观事物的一个实体,它是用来构成系统的一个基本单位,由一组属性和一组行为构成。 面向对象的方法将数据及对数据的操作方法放在一起,作为一个相互依存、不可分离的整体--对象。对同类型对象抽象出其共性,形成类。类中的大多数数据,只能用本类的方法进行处理。类通过一个简单的外部接口,与外界发生关系,对象与对象之间通过消息进行通讯。这样,程序模块间的关系更为简单,程序模块的独立性、数据的安全性就有了良好的保障。通过实现继承与多态性,还可以大大提高程序的可重用性,使得软件的开发和维护都更为方便。 面向对象方法所强调的基本原则,就是直接面对客观存在的事物来进行软件开发,将人们在日常生活中习惯的思维方式和表达方式应用在软件开发中,使软件开发从过分专业化的方法、规则和技巧中回到客观世界,回到人们通常的思维。 1-5 什么叫做封装? 解: 封装是面向对象方法的一个重要原则,就是把对象的属性和服务结合成一个独立的系统单位,并尽可能隐蔽对象的内部细节。 1-6 面向对象的软件工程包括哪些主要内容? 解: 面向对象的软件工程是面向对象方法在软件工程领域的全面应用,它包括面向对象的分析(OOA)、面向对象的设计(OOD)、面向对象的编程(OOP)、面向对象的测试(OOT)和面向对象的软件维护(OOSM)等主要内容。 1-7 简述计算机内部的信息可分为几类? 解: 计算机内部的信息可以分成控制信息和数据信息二大类;控制信息可分为指令和控制字两类;数据信息可分为数值信息和非数值信息两类。 1-8 什么叫二进制?使用二进制有何优点和缺点? 解: 二进制是基数为2,每位的权是以2 为底的幂的进制,遵循逢二进一原则,基本符号为0和1。采用二进制码表示信息,有如下几个优点:1.易于物理实现;2.二进制数运算简单;3.机器可靠性高;4.通用性强。其缺点是它表示数的容量较小,表示同一个数,二进制较其他进制需要更多的位数。 1-9 请将以下十进制数值转换为二进制和十六进制补码: (1)2 (2)9 (3)93 (4)-32 (5)65535 (6)-1 解: (1) (2)10 = (10)2 = (2)16 (2) (9)10 = (1001)2 = (9)16 (3) (93)10 = (1011101)2 = (5D)16 (4) (-32)10 = (11100000)2 = (E0)16 (5) (65535)10 = (11111111 11111111)2 = (
相关推荐
©️2020 CSDN 皮肤主题: 博客之星2020 设计师:CY__ 返回首页