MOV DS,AX MOV AL,X CMP AL,0 JE SUB2 JG SUB1 MOV CL,2
SAL AL,CL
JMP SHORT SUB2 SUB1:ADD AL,3 SAR AL,1 SUB2: MOV Y,AL
MOV AH,4CH
INT 21H CODE ENDS END START
5.28 设X、Y、Z为字节单元。如果X≥0,Z=4X-Y/16,否则,Z=X的绝对值。编程序实现。 程序如下:
DATA SEGMENT X DB 3 Y DB 5 Z DB ? DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AL,X CMP AL,0 JL SS1 MOV CL,2 SAL AL,CL MOV BL,Y MOV CL,4 SAR BL,CL SUB AL,BL
JMP OUT1
SS1: NEG AL OUT1: MOV Z,AL MOV AH,4CH INT 21H CODE ENDS
END START
5.29 字数组M中有10个数据,分类统计其中正数、负数、0的个数,分别存入POSI、NEGA、ZERO 单元。 程序如下:
DATA1 SEGMENT
M DW 21,-34,32,112,-324,0,76,0,48,50
21
POSI DW ? NEGA DW ? ZERO DW ? DATA1 ENDS
CODE1 SEGMENT ASSUME CS: CODE1,DS:DATA1 START: MOV AX,DATA1 MOV DS,AX MOV CX,10 LEA SI,M
AGAIN: CMP WORD PTR [SI],0 JL LOWER JE EQUAL INC POSI JMP LPP1 LOWER: INC NEGA JMP LPP1 EQUAL: INC ZERO LPP1: ADD SI,2 DEC CX JNZ AGAIN MOV AH,4CH INT 21H CODE1 ENDS END START
5.30 试编写程序,从键盘接收一英文单词,以空格结束,将其存入BUF开始的存储单元中,并在最后加上字符串结束符?$?。 主要程序部分:
LEA BX,BUF LOP: MOV AH,1 INT 21H CMP AL,20H JE NEXT MOV [BX],AL INC BX JMP LOP
NEXT: MOV BYTE PTR[BX],?$?
5.31 编程。将AX寄存器中的16位数分成4组,每组4位,从低到高分别放在AL,BL,CL,DL中。 程序段:
START:MOV AX,1234H MOV BX,AX AND AL,0FH ;4 AND BL,0F0H ;3 AND AH,0FH MOV CL,AH ;2 AND BH,0F0H
22
MOV DL,BH ;1
习题六
6.1 循环指令有哪几种?分别写出指令格式及作用。 6.2 循环指令根据什么判断循环是否结束? 6.3 用转移指令能否构成循环?试举例说明。 6.4 多重循环的循环控制如何实现?
6.5 在多重循环中转移指令的使用要注意哪些问题? 6.6 串处理过程中用到循环了吗?怎么使用的? 6.7 列出学过的串处理指令。
6.8 在串处理过程中,如何找到源串和目的串?
6.9 串处理指令都应和哪些重复前缀配合使用?请举例说明。
6.10 在串处理中,方向标志DF的作用是什么?方向标志如何设置?6.11 写出下列程序段的执行结果。 BUFF DB 10,22,14,6,31 TOTAL DB ? ?? MOV BX,OFFSET BUFF MOV CX,TOTAL-BUFF MOV AL,0 AA1: ADD AL,[BX] INC BX LOOP AA1 MOV TOTAL,AL
6.12 分析下列程序段的功能。 X DB 2,-3,15,0,9,4 ?? LEA BX,X MOV CX,6 MOV AX,0 AA2:MOV AL,[BX] CMP AL,0 JNE NEXT INC AH
NEXT:INC BX
LOOP AA2
6.13 判断下列程序段能否完成给定功能。如有错误,请指出并改正。 (1)统计AL中1的个数。要求AL保持原值。 MOV BL,0
MOV CX,8
BB1:RCL AL,1 JNC NEXT INC BL
23
NEXT:LOOP BB1
(2)在ALPHA中查找字母”T”,找到后退出循环。 ALPHA DB “ERTYU”
??
MOV BX,OFFSET ALPHA MOV CX,5
BB2:CMP [BX],?T? LOOPNE BB2
6.14 源串STRG1和目的串STRG2分别放在数据段和附加段中,请写出含有各种段定义的程序段,完成将STRG1传送到STRG2的功能。
6.15 写出计算Y=1×2+3×4+5×6+7×8+9×10的程序段。
6.16 写程序段。查找CATT表中的字符”@”,找到后将SIGN单元置1,否则SIGN单元置0。 6.17 写程序段。在长度为N的字数组VALUE中统计负数的个数并保存到AX中。 6.18 编程。从键盘输入一个数字,在屏幕上显示出以该数字开始的10个数字串。
6.19 编程。比较两个字符串是否相同,统计并显示出相同的字符个数和不同的字符个数。 6.20 编程。在FOUND字数组中找出最小数存入MIN单元。
6.21 STRI单元存有10个字符的字符串,以0结尾,编程去掉其中的空格符,并将后续字符向前递补。
6.22 某班级30名学生,编程序将全班成绩按升序排序。
6.23 将内存中用ASCII码表示的100以内的十进制数转变为二进制数。十进制数不够3位以20H(空格)补齐。
第六章参考答案
习题六答案:
6.11 累加和TOTAL=83
6.12 循环统计X中0的个数
6.13 (1) 将BB1:RCL AL,1改为BB1:ROL AL,1
(2) 将BB2:CMP [BX],?T? LOOPNE BB2 改为: DEC BX BB2:INC BX
CMP [BX],?T?
LOOPNE BB2
6.15 计算Y=1×2+3×4+5×6+7×8+9×10的程序段答案: MOV AL,1 MOV BL,2 MOV DX,0 MOV CX,5 AA1:MUL BL ADD DX,AX INC BL MOV AL,BL INC BL
24
LOOP AA1
6.16 写程序段。查找CATT表中的字符”@”,找到后将SIGN单元置1,否则SIGN单元置0。 catt db 'asd@ddd' sign db ? ??
mov ax,extra mov es,ax mov sign,0 mov al,'@' lea di,catt cld
mov cx,7 repnz scasb jcxz nee mov sign,1 nee: mov ah,4ch int 21h
6.17 写程序段。在长度为N的字数组VALUE中统计负数的个数并保存到AX中。
value dw 2,-4,-5,3,6,6,-8 n equ ($-value)/2 ;元素个数
??
start: mov ax,data mov ds,ax mov cx,n mov bx,0 mov ax,0 rept1:
mov si,value[bx] ;取出元素 cmp si,0 jge let1 ;≥0 转let1 inc ax ;为负数,ax加1 let1: add bx,2 loop rept1
6.18 从键盘输入一个数字,在屏幕上显示出以该数字开始10个数字串。
CODE SEGMENT ASSUME CS:CODE
START: MOV AH,1
INT 21H MOV CX,10 MOV BL,AL
REPT1: CMP BL,'9'
JLE NEXT SUB BL,10
NEXT: MOV DL,BL
25