汇编语言程序设计(四)

3 汇编程序基本结构

在学习高级语言程序设计时,我们知道了程序的三大主要结构:顺序结构、分支结构和循环结构。在汇编语言的源程序也同样有此三大结构,所不同的是它们的表现形式不同。用高级语言编写程序时,由于不使用“转移语句”而使这三种结构清晰明了。

 

但在汇编语言的源程序中,很难不使用“转移语句”(除非是一些只有简单功能的程序),有时甚至会有各种各样的“转移语句”。由于存在这些转移语句,就使得:汇编语言源程序的基本结构显得不太明确。如果源程序的编写者思维混乱,编写出来的源程序在结构上就会显得杂乱无章,反之,如果编写者条理清晰,安排的操作井然有序,那么,编写出来的程序在结构上就会一目了然。

 

总之,不论是高级语言的源程序,还是汇编语言的源程序,其程序的三大基本结构也还是万变不离其宗的。

 

3.1 顺序结构

顺序结构是最简单的程序结构,程序的执行顺序就是指令的编写顺序,所以,安排指令的先后次序就显得至关重要。另外,在编程序时,还要妥善保存已得到的处理结果,为后面的进一步处理直接提供前面的处理结果,从而避免不必要的重复操作。

 

例如,编写程序段,完成下面公式的计算(其中:变量XY32位有符号数,变量ABZ16位有符号数)

 

A(X-Y+24)/Z的商,B(X-Y+24)/Z的余数

 

解:

DATA1 SEGMENT

X DD ?

Y DD ?

Z DW ?

A DW ?

B DW ?

DATA1 ENDS

CODE1 SEGMENT

MOV AX, X

MOV DX, X+2 ;(DX:AX)来保存32位变量X的数值

SUB AX,Y

SBB DX, Y+2 ;(DX:AX)-(Y+2:Y)

ADD AX, 24D

ADC DX, 0 ;(DX:AX)+24

IDIV Z

MOV A, AX

MOV B, DX

CODE1 ENDS

 

在编程序时,常常需要交换二变量之值。假设需要交换值的变量名为:var1var2,临时增加的变量名为temp。常用的算法如下:

temp = var1

var1 = var2

var2 = temp

 

假设有二个字变量word1word2,编写程序段实现交换其值的功能。

 

解:

方法1:用汇编语言指令简单“直译”上面的 交换数据方法

DATA1 SEGMENT

word1 DW ?

word2 DW ?

temp DW ?

DATA1 ENDS

CODE1 SEGMENT

MOV AX, word1

MOV temp, AX ;上二语句实现语句“temp=word1

MOV AX, word2

MOV word1, AX ;上二语句实现语句“word1=word2

MOV AX, temp

MOV word2, AX ;上二语句实现语句“word2=temp

CODE1 ENDS

 

这种方法虽然也能完成功能,但显然其不能充分利用汇编语言的特点,程序效率很低。

 

方法2:用汇编语言指令的特点来直接编译

DATA1 SEGMENT

word1 DW ?

word2 DW ?

DATA1 ENDS

CODE1 SEGMENT

MOV AX, word1

XCHG AX, word2

MOV word1, AX ;XCHG word1, word2来代替这三条指令吗?

CODE1 ENDS

 

该方法充分利用了汇编语言的特点,不仅省去了中间变量temp的定义,而且程序的效率也提高了。

 

3.2 分支结构

分支结构是一种非常重要的程序结构,也是实现程序功能选择所必要的程序结构。由于汇编语言需要书写转移指令来实现分支结构,而转移指令肯定会破坏程序的结构,所以,编写清晰的分支结构是掌握该结构的重点,也是用汇编语言编程的基本功。

 

在程序中,当需要进行逻辑分支时,可用每次分二支的方法来达到程序最终分多支的要求,也可是用地址表的方法来达到分多支的目的。

 

一、显示转移指令实现的分支结构

 

在高级语句中,分支结构一般用IF语句来实现,在汇编语言中,课用无条件转移指令或条件转移指令实现的分支结构。

 

在编写分支程序时,要尽可能避免编写“头重脚轻”的结构,即:当前分支条件成立时,将执行一系列指令,而条件不成立时,所执行的指令很少。这样就使后一个分支离分支点较远,有时甚至会遗忘编写后一分支程序。这种分支方式不仅不利于程序的阅读,而且也不便将来的维护。

 

所以,在编写分支结构时,一般先处理简单的分支,再处理较复杂的分支。对多分支的情况,也可遵循“由易到难”的原则。因为简单的分支只需要较少的指令就能处理完,一旦处理完这种情况后,在后面的编程过程中就可集中考虑如何处理复杂的分支。

 

6.5 已知字节变量CHAR1,编写一程序段,把它由小写字母变成大写字母。

DATA1 SEGMENT

CHAR1 DB ?

DATA1 ENDS

CODE1 SEGMENT

MOV AL, CHAR1

CMP AL, ‘a’

JB next

CMP AL, ‘z’

JA next

SUB CHAR1, 20H ;指令AND CHAR1, 0DFH也可以

next: …

CODE1 ENDS

 

3.3 循环结构

循环结构是一个重要的程序结构,它具有重复执行某段程序的功能。通常,循环结构包括以下四个组成部分:

 

1、循环初始化部分——初始化循环控制变量、循环体所用到变量;

2、循环体部分——循环结构的主体;

3、循环调整部分——循环控制变量的修改、或循环终止条件的检查;

4、循环控制部分——程序执行的控制转移。

 

以上四部分可以在程序中用各种不同的形式体现出来,有时也并非清析地表达出来。

 

在编写循环结构的程序片段时,我们可以多种方法来循环结构。如:循环次数是已知的,可用LOOP指令来构造循环;当循环次数是未知或不定的,则可用条件转移或无条件转移来构成循环结构。

 

例,分类统计字数组data中正数、负数和零的个数,并分别存入内存字变量PositiveNegativeZero中,数组元素个数保存在其第一个字中。

DATA1 SEGMENT

data DW 10

DW 2130, -43, 31, -321, -1234, 345, 0, 3213, 0, 5477

Positive DW 0

Negative DW 0

Zero DW 0

DATA1 ENDS

CODE1 SEGMENT

ASSUME CS:CODE1, DS:DATA1

START: MOV AX, DATA1

MOV DS, AX

XOR AX, AX ;AX来对正数计数 

XOR BX, BX ;BX来对负数计数

XOR DX, DX ;DX来对零计数

MOV CX, data ;CX来进行循环计数

JCXZ save ;考虑数组的元素个数为0的情况

LEA SI, data+2 ;用指针SI来访问整个数组

again: CMP word ptr [SI], 0

JL lower

JE equal

INC AX

JMP loop1

lower: INC BX

JMP loop1

equal: INC DX

loop1: ADD SI, 2

LOOP again

save: MOV Positive, AX ;把各类的统计数保存到内存单元中

MOV Negative, BX

MOV Zero, DX

MOV AX, 4C00H

INT 21H

CODE1 ENDS

END

 

计算数组score的平均整数并存入内存字变量Average数组以-1为结束标志。

DATA1 SEGMENT

data DW 90, 95, 54, 65, 36, 78, 66, 0, 99, 50, -1

Average DW 0

DATA1 ENDS

CODE1 SEGMENT

ASSUME CS:CODE1, DS:DATA1

START: MOV AX, DATA1

MOV DS, AX

XOR AX, AX

XOR DX, DX ;(DXAX)来保存数组元素之和

XOR CX, CX ;CX来保存数组元素个数

LEA SI, data ;用指针SI来访问整个数组

again: MOV BX, word ptr [SI]

CMP BX, 0

JL over

ADD AX, BX

ADC DX, 0 ;把当前数组元素之值加到(DXAX)

INC CX ;数组元素个数加1

ADD SI, 2

JMP again

over: JCXZ exit ;防止零作除数,即数组是空数组

DIV CX

MOV Average, AX

exit: MOV AX, 4C00H

INT 21H

CODE1 ENDS

END START

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值