【汇编语言】典型例题及代码

文章目录

判断字符串中是否有数字

题目描述
在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
上一篇:SQL日期相关的语句


下一篇:python matplotlib 实时绘图