文章目录
判断字符串中是否有数字
题目描述
在STR到STR+99单元中存放着一个字符串,试编写程序测试该字符串中是否有数字,若有将CL置1,否则CL置0。
代码及注释
DATA SEGMENT
STR DB 'abc2uuuk_o$' ;字符串存入STR中
LEN EQU $-STR
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
XOR CX,CX ;清空CX
MOV CL,LEN ;将字符串长度存入CX
MOV BL,100
CMP CL,BL ;比较CL和100,因为题目要求STR到STR+99,若长度大于100,则需要将长度置为100
JB X ;长度大于100则跳转,直接进行后续操作,否则把100存入CL
XOR CX,CX
MOV CL,100 ;100存入CL代替LEN
X:MOV SI,-1 ;SI作为指针,存入-1
NUMBER:INC SI ;SI加一
MOV BL,30H
CMP STR[SI],BL ;看字符的ASCII码是否大于等于0的ASCII码
JAE NEXT ;大于则跳转
LOOP NUMBER ;不是则不是数字,检查下一个字符串
MOV CL,0 ;运行到最后都不是,则CL置0
JMP EXIT
NEXT:MOV BL,39H
CMP STR[SI],BL ;看字符的ASCII码是否小于等于9的ASCII码
JBE LAB1 ;是则说明就是字符就是数字,可以将CL置1跳出程序
LOOP NUMBER ;不是则不是数字,检查下一个字符串
LAB1:XOR CX,CX
MOV CL,1 ;是数字会跳转到此处,CL置1
EXIT:MOV AH,4CH
INT 21H
CODE ENDS
END START
找出数组中第一个负数
题目描述
在字节数组中找出第一个负数,并将该负数存入RES单元中;假设该数组中包含20个带符号数,且至少有1个负数。
代码及注释
DATA SEGMENT
RES DB ?
BUF DB 2,3,9,-4,8,6,0,3,-3,-4,8,7,9,2,3,5,-9,4,5,8
COUNT EQU 20 ;题目要求20个带符号数,直接存诚20
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA;
MOV DS,AX
MOV SI,OFFSET BUF; ;SI作为指针
XOR AX,AX
LOP:MOV AL,[SI]
MOV BL,0
CMP AL,BL ;比较当前数和0
JL STORE ;有符号数比较,若当前数为负数,跳转
INC SI
JMP LOP ;题目要求一定有至少一个负数,所以可以使用无条件跳转
STORE:MOV RES,AL ;将AL,即负数的当前数存入RES
MOV AH,4CH
INT 21H
CODE ENDS
END START
小写转大写
题目描述
试编写一个汇编程序,能对键盘输入的小写字母用大写字母显示出来(要求采用子程序格式,即采用子程序完成将小写字母转化成大写字母)。
代码及注释
DATA SEGMENT
MESSAGE DB 'This is not a lower case letter.',13,10,'$' ;不是小写字母的提示信息
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV AH,01
INT 21H ;输入字符结束
MOV BL,97
CMP AL,BL ;比较输入字符与a的ASCII码
JB EXIT ;输入字符不是小写字母则跳转到退出位置
MOV BL,122
CMP AL,BL ;比较输入字符与z的ASCII码
JA EXIT ;输入字符不是小写字母则跳转到退出位置
MOV BL,AL
MOV BH,0
CALL NEXT ;已判断是小写字母则调用子程序
MOV AH,4CH
INT 21H
EXIT:MOV AH,9 ;不是小写字母则输出不是的提示
MOV DX,SEG MESSAGE
MOV DS,DX
MOV DX,OFFSET MESSAGE
INT 21H
MOV AH,4CH ;中断程序
INT 21H
NEXT:MOV AL,32 ;小写变大写子程序
SUB BL,AL ;大小写字母之间ASCII码相差32,输入字符ASCII-32得到大写字母
MOV DL,BL
MOV AH,02
INT 21H ;输出字符
RET
CODE ENDS
END START
比较数组对应位并分大小存放
题目描述
有2个数组:
ary1 db 12,-35,0,126,-90,-5,68,120,1,-19
ary2 db 24,25,0,-38,-89,99,68,100,2,-20
比较两个数组的对应位,将大的数放在ary1数组中,小的数放在ary2中(要求采用子程序格式)
代码及注释
DATA SEGMENT
ARY1 DB 12,-35,0,126,-90,-5,68,120,1,-19
ARY2 DB 24,25,0,-38,-89,99,68,100,2,-20
LEN EQU $-ARY2
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV SI,OFFSET ARY1 ;SI作为ARY1指针
MOV DI,OFFSET ARY2 ;DI作为ARY2指针
LOP:MOV AL,[SI]
CMP AL,[DI] ;比较ARY1与ARY2中对应位置的值
JG NEXT ;若ARY1中值大直接跳转,进入下一步,否则需要交换
CALL FUN ;调用子程序进行两数组中值交换
NEXT:INC SI
INC DI ;指针后移
CMP SI,LEN
JNZ LOP ;若SI没到最后则跳转
MOV AH,4CH
INT 21H
FUN:MOV BL,[DI] ;子程序,用于交换两数组中的值
MOV [DI],AL
MOV [SI],BL
RET
CODE ENDS
END START
排序
题目描述
数据按字节存储,按降序排序,实现排序。
排序方法图示如下:
代码及注释
DATA SEGMENT
A DB 12,11,5,9,3
DB 18,4,1,7,2
CNT EQU $-A
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV CX,CNT-1 ;CX置为初始循环次数
MOV BX,0
LOOP1:MOV DX,CX
MOV SI,1 ;因为改为DB,SI初始为1
LOOP2:MOV AL,A[BX]
CMP AL,A[BX+SI] ;比较两值
JNB L1 ;大于等于则直接跳转,进行后续步骤
XCHG AL,A[BX+SI]
MOV A[BX],AL ;否则交换两值
L1:INC SI ;改为DB,SI每次增加1
LOOP LOOP2
ADD BX,1 ;改为DB,BX每次增加1
MOV CX,DX ;细节注意,内循环,即LOOP2的循环次数每次都会减小1,而CX在经过下一个语句LOOP LOOP1时已经回减小1,再存入DX,再下一次取出时又被减小1,以此来实现每次CX都逐渐减小
LOOP LOOP1
MOV AH,4CH
INT 21H
CODE ENDS
END START
冒泡排序
代码及注释
DATA SEGMENT
A DW 1223,83,456,355,89
DW 948,5,123,789,567
CNT EQU ($-A)/2
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV CX,CNT-1
LOOP1:MOV DX,CX
MOV SI,0 ;每次排序都是从头开始的
LOOP2:MOV AX,A[SI] ;比较当前值与其下一个数
CMP AX,A[SI+2]
JNA L1 ;小于等于,即这两个数的顺序是递增的则跳转,直接进行后续操作
XCHG AX,A[SI+2] ;否则交换两值
MOV A[SI],AX
L1:ADD SI,2 ;LOOP2内循环中每次SI向后一位
LOOP LOOP2
MOV CX,DX ;实现细节与题目四中相同
LOOP LOOP1
MOV AH,4CH
INT 21H
CODE ENDS
END START