题目描述
在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