ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-02-01 23:35:10  阅读:266  来源: 互联网

标签:CODE 汇编语言 代码 MOV BL SI AX 例题 DATA


文章目录

判断字符串中是否有数字

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

标签:CODE,汇编语言,代码,MOV,BL,SI,AX,例题,DATA
来源: https://blog.csdn.net/weixin_46068120/article/details/122766740

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有