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

判断字符串中是否有数字

题目描述
在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
  • 10
    点赞
  • 123
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
5.1试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来。 5.2 编写程序,从键盘接收一个小写字母,然后找出它的前导字符和后续字符,再按顺序输出 5.3 将AX寄存器中的16位数分成4组,每组4位,然后把这四组数分别放在AL、BL、CL、DL中。 5.4 试编写一程序,要求比较两个字符串STRING1和STRING2所含字符是否相同,若相同则显示‘MATCH’,若不相同则显示‘NOT MATCH’。 5.5 试编写一程序,要求能从键盘接收一个个位数N,然后响铃N次。 5.6 编写程序,将一个包含有20个数据的数组M分成两个数组:正数数组P和负数数组N,并分别把这两个数组中的数据的个数显示出来。 5.7 试编制一个汇编语言程序,求出首地址为DATA的100D字数组中的最小偶数,并把它放在AX中。 5.8 把AX中存放的16位二进制数K看作是8个二进制的“四分之一字节”。试编写一个程序,要求数一下值为3(即11B)的四分之一字节数,并将该数在终端上显示出来。 5.9 试编写一汇编语言程序,要求从键盘接收一个四位的十六进制数,并在终端上显示与它等值的二进制数。 5.10 设有一段英文,其字符变量名为ENG,并以$字符结束。试编写一程序,查对单词SUN在该文中的出现次数,并以格式”SUNXXXX“显示出次数。 5.11 从键盘输入一系列以$为结束的字符串,然后对其中的非数字字符进行计数,并显示出计数结果。 5.12 有一个首地址为MEM的100D字数组,试编制程序删除数组中所有为零的项,并将后续项向前压缩,最后将数组的剩余部分补上零。 5.13 在STRING到STRING+99单元中存放着一个字符串,试编制一程序测试该字符串中是否存在数字,如有,则把CL的第五位置1,否则置0. 5.14 在首地址为TABLE的数组中按递增次序存放着100H个16位补码数,试编写一个程序把出现次数最多的数及其出现的次数分别放在AX和CX中。 5.15 数据段中已定义了一个有N个字数据的数组M,试编写一程序求出M中绝对值最大的数,把它放在数据段的M+2n单元中,并将该数的偏移地址存放在M+2(n+1)单元中。 5.16 在首地址为DATA的字数组中,存放了100H个16位补码数,试编写一个程序求出它们的平均值放在AX寄存器中;并求出数组中有多少个数小于此平均值,将结果放在BX寄存器中。 5.17 试编写一个程序,把AX中的十六进制数转换为ASCII码,并将对应的ASCII码依次存放到MEM数组中的四个字节中,例如:当(AX)=2A49H时,程序执行完后,MEM中的4个字节的内容为39H,34H,41H和32H。 5.18 把0~100D之间的30个数存入以GRADE为首地址的30个字数组中,GRADE+i表示学号i+1的学生的成绩。另一个数组RANK为30个学生的名次表,其中RANK+i的内容是学号为i+1的学生的名次。编写一程序,根据GRADE中的学生成绩,将学生名次填入RANK数组中。 5.19 已知数组A包含15个互不相等的整数,试编写一程序,把既在A中又在B中出现的整数存在于数组中C中。 5.20 设在A,B和C单元中存放着三个数,若三个数都不是0,则求出三树之和并存放于D单元中;其中有一个数为0,则把其他两个数也清零。试编写此程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值