练习题目:
1. 通过键盘输入一个小写字母,找出对应的前导字母和后续字母,再按顺序显示这三个字母。
2. 编写一个程序,要求比较数组ARRAY中的三个16位补码,并根据比较结果在终端上显示如下信息:
1) 如果三个数都不相等,显示0;
2) 如果三个输油两个相等,显示1;
3) 如果三个数都相当,显示2。
3. 从键盘输入10个字符,然后以与键入相反的顺序将10个字符输出到显示屏幕上。(定义数据段保存录入字符)
4. 编写一个程序,要求通过键盘接收一个个位数N,然后显示N个字母‘$’。
5. 将BX寄存器中的数用16位二进制数形式显示出来。
6. 用15行*16列的表格形式显示ASCII码为10H-FFH的所有字符。
题目分析:
1.第一题的关键在于保存输入的数值在寄存器中,并判断输入的值是否为小写字母,若为小写字母输出时才能保证按顺序输出,若不为小写字母,则结束
2.首先初始化ARRAY数组中,由于占用两个字节,所以又将数组赋值给AX,BX,CX进行操作,关键在于两两对比得出大小,将输出的0,1,2封装成模块调用,当得出结果就立即输出结果
3.将输入的十个字符倒叙输出,采用变址寻址的方式,用SI,DI寄存器保存相对偏移量,一个正序对数组赋值,一个逆序将数组输出
4.第四题是将输入的数字就输出多少‘$’,这就要求我们得到输入的数字,ASCII码就是将得到的AL的值减去30H,控制循环的次数,调用DOS功能,输出’$’。
5.先输入4个字符,将ASCII码转化成二进制码,其中需要判断是数字还是字母,数字减去30H,若为字母还需要再减去07H,将16进制数保存在BX寄存器,每次通过移位通过进位标志位判断是0还是1以此来输出
6.采用CL和CH分别来控制循环次数,内层循环为循环每一行的内容,其中需要输出空格,外层循环为输出下一行的内容,在一行输出完毕后需要输出回车换行,对此需要对DL重新赋值,需要保存之前的值。
设计方案:
1.
CODE SEGMENT
ASSUME CS:CODE
START:
MOV AH,07H
INT 21H
MOV BL,AL
CMP BL,5AH;判断是否为小写字母
JBE L2;若不是,跳转至结束
CMP BL,7AH;判断是否为小写字母
JA L2;若不是,跳转至结束
L1: SUB AL,01H
MOV DL,AL
MOV AH,02H
INT 21H
ADD DL,01H
INT 21H
ADD DL,01H
INT 21H
L2: MOV AH,4CH
INT 21H
CODE ENDS
END START
2.
DATA SEGMENT
;此处输入数据段代码
ARRAY DW 1100H,1100H,1100H
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
;此处输入代码段代码
LEA BX,ARRAY
MOV CX,[BX]
CMP CX,[BX+2]
JNE L3
MOV CX,[BX+2]
CMP CX,[BX+4]
JNE L2
L1: MOV AH,02H
MOV DL,'2'
INT 21H
JMP EXIT
L2: MOV AH,02H
MOV DL,'1'
INT 21H
JMP EXIT
L3: MOV CX,[BX]
CMP CX,[BX+4]
JNE L4
JMP L2
L4: MOV CX,[BX+2]
CMP CX,[BX+4]
JE L2
MOV AH,02H
MOV DL,'0'
INT 21H
EXIT:MOV AH,4CH
INT 21H
CODE ENDS
END START
逻辑图:
3.
DATA SEGMENT
;此处输入数据段代码
ARRAY DB 10 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
;此处输入代码段代码
LEA BX,ARRAY
MOV CL,0AH
MOV SI,9
MOV DI,0
L2: MOV AH,01H
INT 21H
MOV [ARRAY][DI],AL
INC DI
DEC CL
JNZ L2
MOV AH,02H
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H
MOV CL,0AH
L1: MOV AH,02H
MOV DL,[BX][SI]
INT 21H
DEC SI
SUB CL,1
JNZ L1
MOV AH,4CH
INT 21H
CODE ENDS
END START
4.
CODE SEGMENT
ASSUME CS:CODE
START:
;此处输入代码段代码
MOV AH,01H
INT 21H
MOV CL,AL
SUB CL,30H;01H ASCII to number
MOV AH,02H
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H
J1: MOV DL,'$'
INT 21H
DEC CL
JNZ J1
MOV AH,4CH
INT 21H
CODE ENDS
END START
逻辑图:
5.
CODES SEGMENT
ASSUME CS:CODES
START:
;此处输入代码段代码
MOV CH,4
MOV CL,4
MOV BX,0
J1: MOV AH,01H
INT 21H
SUB AL,30H
CMP AL,0AH
JL J5
SUB AL,07H
J5: SHL BX,CL
OR BL,AL
DEC CH
JNZ J1
MOV CX,16
J2: SHL BX,1
JNC J3
MOV DL,'1'
MOV AH,02H
INT 21H
JMP J4
J3: MOV DL,'0'
MOV AH,02H
INT 21H
J4: DEC CX
JNZ J2
MOV AH,4CH
INT 21H
CODES ENDS
END START
逻辑图:
6.
CODES SEGMENT
ASSUME CS:CODES
START:
;此处输入代码段代码
MOV CH,15
MOV BL,10H
J1: MOV CL,16
J2: MOV DL,BL
MOV AH,02H
INT 21H
INC BL
DEC CL
JNZ J2
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H
DEC CH
JNZ J1
MOV AH,4CH
INT 21H
CODES ENDS
END START
逻辑图:
1、输入一个字母,连续输出其前序字母和后续字母
输入非小写字母时:
2、输入三个数字,ARRAY DW 1100H,1200H,1300H都不相同,输出0
ARRAY DW 1100H,1100H,1300H有2个相同:
ARRAY DW 1100H,1100H,1100H
3、输入十个字符,逆序输出
4、输入数字5回显,显示出5个‘$’符号,
5、输入十六进制1468H,输出结果0001010001101000
6、输出显示ASCII码为10H-FFH的所有字符
欢迎大家指教学习