实验 9 回文字符串的判断
实验日期: 2012-12-21 指导教师: 刘波老师 星期: 五 节次: 2 实验课时: 2 姓名: 王晓莉 学号: 10531008 专业、班级: 10电信1班 得分:
1、 实验目的
掌握汇编语言设计和调试方法。
2、 实验内容
定义一个字符串,用程序判断该字符串是不是回文字符串。若字符串与颠倒后的字符串相等,则
该串为回文
字符串 aba abab lovevol
3、实验步骤
1)、用连续或单步方式运行程序,检查AX中内容变化情况。 。
#make_COM#
是否是回文 是 不是 是
ORG 100h jmp start
s DB 'aaabbbaaa' s_size DW 9
start: LEA DI, s
MOV SI, DI ADD SI, s_size
DEC SI ; point to last char! MOV CX, s_size
SHR CX, 1 ; divide by 2!
next_char: MOV AL, [DI] MOV BL, [SI] CMP AL, BL
JNE not_Palindrome INC DI DEC SI
LOOP next_char
is_Palindrome: MOV AX, 0FFFFh
; Set AX to 0FFFFh - the string is \ JMP stop not_Palindrome:
; Set AX to 0ABCDh - the string is \ MOV AX, 0ABCDh stop:RET
4、实验运行结果: MOV AL, [DI]
MOV AX, 0FFFFh
最终结果:
5、思考题解答
1)程序中为啥要将CX除以2?
答:因为若字符串与颠倒后的字符串相等,则为回文,所以首尾字符做比较,比较次数是CX 次,也就是字符串长度的一半。
2)定义一个字符串,检查该字符串是否是回文,若是回文,在屏幕上打印出前半部分字符,其后加上“ yes”;若不是回文,在屏幕上打印出所有字符,其后加上“ no” #MAKE_EXE#
DSEG SEGMENT
PASS1 DB 'AAABBBBAAA' s_size EQU 10 D1 DB 'AAABB YES','$' D2 DB 'AAABBBAAA NO','$'
DSEG ENDS
CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG
start:MOV AX,DSEG MOV DS,AX
LEA DI, PASS1 MOV SI, DI ADD SI, s_size DEC SI
MOV CX, s_size
SHR CX, 1 ; divide by 2! next_char:
MOV AL, [DI] MOV BL, [SI] CMP AL, BL JNE not_Palindrome INC DI
DEC SI LOOP next_char is_Palindrome:
LEA DX, D1
MOV AH,9 INT 21H
; Set AX to 0FFFFh - the string is \ JMP stop not_Palindrome:
; Set AX to 0ABCDh - the string is \ LEA DX, D2 MOV AH,9 int 21h stop: MOV AH,4CH INT 21H CSEG
ENDS
END START
若定义字符串为aaaabbbdda则结果是: