汇编语言程序设计知识点 下载本文

:

MOV AL,BYTE PRT DAW SUB DAB,AL

第五章 循环与分支程序设计

(1)循环程序结构,分支程序结构

eg. BEG为起始地址的存储区域中存放有100个字节数据,现将其首、尾颠倒过来,重新排放这100个字节数据。请在空行处各填上一条指令完善该程序。

MOV CX,31H LEA SI,BEG MOV DI,SI

ADD DI,99 DON:MOV AL,[SI]

XCHG AL,[DI] MOV [SI],AL

INC SI DEC DI LOOP DON

1、阅读如下程序段:

ADRR DB XXH,XXH,……,XXH NUM EQU $-ADRR RETT DB ? … MOV CX,NUM MOV BX,-1 INC BX

;BX值增一

;访问ADRR数组中偏移地址为BX的值并与0比较

;若大于0则继续DON循环 ;否则转至NEXT

;CX中存放ADRR数组空间大小 ;NUM为ADRR数组空间大小

DON:

CMP ADRR[BX],0 LOOPZ DON JNZ NEXT

MOV BL,OFFH MOV RETT,BL HLT

请回答(1)该程序完成的功能是什么?

在以Adrr为起始地址的数组中查找第一个非0数据

(2)程序执行后RETT字节单元中的内容是什么?

;若循环完未转至NEXT,则BL中为OFFH ;将BL中址送RETT

NEXT:

若找到非0数据,则将第一个非0数据在数组中的偏移量送入RETT单元中,若未找到,则将0FFH送入RETT单元中。

5

2、阅读程序段:

STRING DB ‘ABCDEFGHIJ‘ ┇

MOV AH,01 INT 21H DEC AL

;以上三条语句是将1-9的ASCII码转换为1-9 ;BX+AX,即将BX中存放待输出字符的偏移地址

;将STRING中偏移地址为BX的字符取出

AND AL,0FH XOR AH,AH ADD BX,AX MOV AH,02H INT 21H ┇

请回答:(1)上述程序段的功能是什么?

;这条语句等价于减去30H

MOV BX,OFFSET STRING MOV BL,[BX]

上述程序段的功能是根据从键盘输入的字符 ‘1’ ~ ‘9’ ,确

定在显示器上显示STRING中第几个字符。

(2)从键盘输入字符 ‘4’,程序段有什么结果? 输出’D’

3、阅读程序段:

BLOCK DB 20H,1FH,08H,81H,OFFH… RESULT DB ? …

LEA SI,BLOCK ;使SI指向BLOCK单元首地址

MOV CX,[SI] ;将SI地址中操作数传送到CX寄存器中 INC SI

;SI指向下一个地址

MOV AL,[SI] ;将SI中操作数传送到AL寄存器中 CMP AL,[SI+1] ;比较BLOCK/BLOCK+1地址中操作数

JNG NEXT

;若BLOCK〉BLOCK+1则转至NEXT

MOV AL,[SI+1] ;否则将BLOCK+1中数送入AL寄存器 INC SI

;SI指向下一个地址

;循环执行LOP1

START:

LOP1:

NEXT:

LOOP LOP1

MOV RESULT,AL ;将AL中数送入RESULT中

问:(1)该程序完成的功能是从32个有符号数中找出最小的送入RESULT中。 (2)该程序循环的次数是31次。

4、下列程序片段用来分别统计ARRAY数组中奇数和偶数的个数。请在空白处填写合适的指令。

6

DATA SEGMENT

ARRAY DW 23ABH,1570H,567,1765H,46,5210H

;COUNT为数组中元素个数

COUNT EQU ($-ARRAY)/2 DA1 DB ? DA2 DB ? DATA ENDS ……

LEA SI,ARRAY MOV CX,COUNT LOP1:

MOV AX,[SI]

;将ARRAY中偏移地址为SI的元素送AX ;最低为为1则为奇数,否则为偶数

;SI中存放ARRAY首地址 ;CX中存放数组元素个数

TEST AX,0001H

JZ LOP2 INC BL JMP LOP3 LOP2:

INC BH LOP3:

ADD SI,2

;SI地址值增2

DEC CX JNZ LOP1 MOV DA1,BL MOV DA2,BH

5.阅读如下程序片段,回答所提出的问题,假定X1,X2,…XN为无符号数。

ORG 100H

BLOK DW X1,X2,…,XN COUNT EQU($-BLOK)/2 RESULT DW ?

LEA BX,BLOK-2 MOV CX,COUNT XOR AX,AX GOON:ADD BX,2 CMP AX,[BX] JAE NEXT MOV AX,[BX] NEXT:LOOP GOON

7

MOV RESULT,AX

程序片段执行完后,RESULT字单元的内容= MAX(X1,X2…Xn) , (BX)= 100H+2*(COUNT-1) ,程序循环次数= COUNT 。 6.下列程序片段调用单个字符显示的2号功能显示STRING中的字符串‘COMPUTER’(不显示字符‘$’)。 (调用DOS的2号功能实现)

STRING DB‘COMPUTER’,‘$’ ┇

设AX,BX中的数一个为正数,一个为负数,编写程序片段完成将正数送到PLW单元中存放 。

编程实现:

TEST AX,8000H JE K1或JZ K1 MOV PLW,BW JMP DONE

K1: MOV PLW,AX DONE:

7、将AX寄存器中的16位数分成4组,每组4位,然后把这四组数分别存放在AL、BL、CL、DL寄存器中。

DATAREA SEGMENT

CODE SEGMENT

TEMP DB 4 DUP(?)

DATAREA ENDS

ASSUME CS:CODE,DS:DATAREA MOV DS,DATAREA MOV CL,4 MOV CH,4 LEA BX,TEMP MOV DX,AX AND DL,0FH MOV [BX],DL INC BX DEC CH

SHR AX,CL JNZ ROTATE

;将TEMP地址值送BX ;将AX寄存器值送DX ;将DX寄存器高8位清零 ;DX寄存器低8位地址送入BX中 ;BX增1 ;逻辑作揖 ;循环数减1

;若循环未完成则继续循环

8

START:

ROTATE:

MOVE:

MOV DL,TEMP+1