:
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