1.从键盘输入两个相同长度的字符串,分别放到数据段和附加段,利用串比较指令比较数据段和附加段中两个字符串,如果两串一样,输出Y,否则输出N。
这个程序调试了好久,之间遇到两个问题,其一是附加段的使用,需要对DS压栈对ES调整处理,即
1 PUSH DS 2 MOV AX,ES 3 MOV DS,AX 4 ;...... 5 POP DS
其二是,串比较指令CMPSW进行字比较,而CMPSB进行字节比较,需要区分开。(其实我现在还不明白即便是字符组成的串,进行字比较为什么会出错,有高手知道吗?)
下面是程序:
1 DATA SEGMENT 2 VA DB 50,0,50 DUP(0),'$' 3 V1 DB 'Y' 4 V2 DB 'N' 5 ENTER DB 0AH, 0DH, '$' 6 DATA ENDS 7 DATA2 SEGMENT 8 VB DB 50,0,50 DUP(0),'$' 9 DATA2 ENDS 10 CODE SEGMENT 11 ASSUME CS:CODE,DS:DATA,ES:DATA2 12 START: MOV AX,DATA ;装入DS 13 MOV DS,AX 14 MOV AX,DATA2 ;装入ES 15 MOV ES,AX 16 17 MOV DX,OFFSET VA ;输入字符串VA 18 MOV AH,0AH 19 INT 21H 20 21 PUSH DX ;回车换行 22 MOV DX, OFFSET ENTER 23 MOV AH, 09H 24 INT 21H 25 POP DX 26 27 PUSH DS 28 MOV AX,ES ;对附加段的处理 29 MOV DS,AX 30 MOV DX,OFFSET VB ;输入字符串VB 31 MOV AH,0AH 32 INT 21H 33 POP DS 34 35 PUSH DX ;回车换行 36 MOV DX, OFFSET ENTER 37 MOV AH, 09H 38 INT 21H 39 POP DX 40 41 LEA SI,VA ;把源串地址传给SI 42 ; PUSH DS 43 ; MOV AX,ES 44 ; MOV DS,AX 45 LEA DI,VB ;把目的串地址传给DI 46 ; POP DS 47 48 CLD ;清除方向标志,使向前 49 MOV CX,50 ;重复计数器 50 REPE CMPSB ;相等则重复,CX为0或者遇到不相等则顺序执行 51 JE J1 ;相等则跳转 52 MOV AH,2 53 MOV DL,V2 54 INT 21H 55 JMP J2 56 J1: MOV AH,2 57 MOV DL,V1 58 INT 21H 59 J2: MOV AH,4CH 60 INT 21H 61 CODE ENDS 62 END START
2.下面顺便提一下常见的四种中断:
1)键盘输入字符中断
Mov ah,1
Int 21h;结果是 al←输入字符的ASCII码
2)屏幕显示一个字符中断
Mov ah,2
Mov dl,要显示字符的ASCII码
Int 21h;(注意:这里al会变为要输出的字符的ASCII码)
3)屏幕显示字符串(9号功能调用)
格式: MOV DX, 字符串的偏移地址
MOV AH, 09H
INT
21H
在使用9号功能调用时,应当注意以下问题:
① 待显示的字符串必须先放在内存一数据区(DS段)中,且以‘$’符号作为结束标志。
② 应当将字符串首地址的段基址和偏移地址分别存入DS和DX寄存器中。
4)键盘输入字符串(0AH号功能调用)
格式: MOV DX, 已定义缓冲区的偏移地址
MOV AH, 0AH
INT 21H
① 执行前先定义一个输入缓冲区,缓冲区内第一个字节定义为允许最多输入的字符个数,该个数包括回车符0DH在内。第二个字节保留,在执行程序完毕后存入输入的实际字符个数(不含回车)。从第三个字节开始存入从键盘上接收字符的ASCII码。若实际输入的字符个数少于定义的最大字符个数,则缓冲区其他单元自动清0。若实际输入的字符个数大于定义的字符个数,其后输入的字符丢弃不用,一直到输入回车键为止。
② 应当将缓冲区首地址的段基址和偏移地址分别存入DS和DX寄存器中。
举例: