SCAU 汇编实验五

5.5* 试编写一程序,要求能从键盘接收一个个位数 N,然后响铃 N 次(响铃的 ASCII 码为 07)。

算法: 最尴尬的是,程序根本没响,不知对错。仅通过编译。
代码:

DATAS SEGMENT
	N DB 0  ;响铃次数
DATAS ENDS

STACKS SEGMENT
       DB 30H DUP(0)
   TOP LABEL WORD
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    MOV AX,STACKS
    MOV SS,AX
    MOV SP,TOP
    
    ;;算法核心;
	MOV AH,1
	INT 21H
	
	MOV AX,30H
	SUB N,AL ;数字字符转为数字
	
	XOR CX,CX
	MOV CL,N
L2: PUSH CX
	MOV CX,1000  ;延时1000
    MOV DL,7
	MOV AH,2
	INT 21H
DELAY: LOOP DELAY
	POP CX
	LOOP L2
    ;;算法核心;     
    
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START



5.6 * 编写程序,将一个包含有 20 个数据的数组 M 分成两个数组:正数数组 P 和负数数组 N, 并分别把这两个数组中数据的个数显示出来。

**算法:**有严重错误!!!不知道为什么负数识别不了
代码:

DATAS SEGMENT
  ;MEM DW 0,0,0,-1,-2,3,14 DUP(0)
  MEM DW 1,2,3,1,2,3,0,0,-1
  LEN DW ($-MEM)/2
 STR1 DW 20 DUP(0)   ;非负数数组
 LEN1 DW 0
 STR2 DW 20 DUP(0)    ;负数数组
 LEN2 DW 0
  
DATAS ENDS

STACKS SEGMENT
       DW 30H DUP(0)
   TOP LABEL WORD
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    MOV ES,AX
    MOV AX,STACKS
    MOV SS,AX
    MOV SP,TOP
    
    ;;算法核心;
    ;变量说明:AX指向原数组待读取的数据
    ;          BX指向非负数数组待存放数据的单元,
    ;          DX指向负数数组待存放数据的单元
    LEA SI,MEM
    LEA BX,STR1
    LEA DX,STR2
    MOV CX,LEN
    CLD

AGAIN:    
    LODSW
    PUSH AX
    MOV BP,AX
    MOV AX,0
    CMP [BP],AX;判断读取的数据是不是负数
    JL  L1
    
    MOV DI,BX ;非负数
    MOV AX,BP
    STOSW
    MOV BX,DI
    ADD LEN1,1
    JMP L2
L1: 
	MOV DI,DX  ;负数
	MOV AX,BP
	STOSW
	MOV DX,DI
	ADD LEN2,1
	
L2: POP AX
	ADD AX,2  ;准备读取原数组的下一个数据
	LOOP AGAIN
	
	MOV DX,30H
	ADD DX,[LEN1]
	MOV AH,2
	INT 21H
	MOV DX,0AH
	MOV AH,2
	INT 21H
	MOV DX,30H
	ADD DX,[LEN2]
	MOV AH,2
	INT 21H
	
	
	;DEBUG代码;
	MOV DX,0AH
	MOV AH,2
	INT 21H
	XOR CX,CX
	MOV CX,LEN1
	
 	LEA DI,STR1
DISP:	
	MOV DX,30H
	ADD DX,[DI]
	MOV AH,2
	ADD DI,2
	INT 21H
	LOOP DISP
	;DEBUG代码;
	
    MOV AH,4CH
    INT 21H
    
CODES ENDS  
    END START

5.7* 试编写一个汇编语言程序,求出首地址为 DATA 的 100D 字数组中的最小偶数,并把它 存放在 AX 中。

算法: 有错误!程序直接记录了最小的数,不知道为什么奇偶判断没起作用
代码:

DATAS SEGMENT
 DATA DW 8,7,6,5,4,3,2,1;假设全部非负
  LEN DW ($-DATA)/2
  
DATAS ENDS

STACKS SEGMENT
       DW 30H DUP(0)
   TOP LABEL WORD
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    MOV AX,STACKS
    MOV SS,AX
    MOV SP,TOP
    
    ;;算法核心;
    ;变量说明:AX存放最小偶数
    ;          BX指向待比较的数 
    LEA BX,DATA
    MOV AX,0FFFFH  
    MOV CX,LEN
    
AGAIN:    
    CMP [BX],AX
    JA  L1   ;打擂
    ;MOV DX,[BX]
    ;SHL DX,1
    MOV DX,[BX]
    TEST DX,1
    JC  L1   ;判断是否是偶数
    MOV AX,[BX]  ;是偶数则覆盖

L1: ADD BX,2
	LOOP AGAIN
	
	MOV DX,AX
    ADD DX,30H
    MOV AH,2
    INT 21H

    MOV AH,4CH
    INT 21H
    
CODES ENDS  
    END START

5.8 把 AX 中存放的 16 位二进制数 K 看作是 8 个二进制的“四分之一字节”。试编写程序 要求数一下值为 3(即11B)的四分之一字节数,并将该数(即 11B 的个数)在终端上显示出来。

算法:
代码:

在这里插入代码片

5.12 有一个首地址为 MEM 的 100D 字数组,试编制程序删除数组中所有为 0 的项,并将后续项向前压缩,最后将数组的剩余部分补上 0。

算法:
代码:

DATAS SEGMENT
  MEM DW 1,0,0,0,0,0,94 DUP(3)
  LEN DW ($-MEM)/2   ;数组元素个数
DATAS ENDS

STACKS SEGMENT
       DW 30H DUP(0)
   TOP LABEL WORD
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    MOV ES,AX
    MOV AX,STACKS
    MOV SS,AX
    MOV SP,TOP
    
    ;;算法核心;
    ;变量说明:SI指向待覆盖的单元,DI指向下一个待比较的非0单元
    LEA SI,MEM
	LEA DI,MEM
	MOV CX,LEN ;记录循环次数
	
AGAIN:
	MOV AX,0
	CMP [DI],AX
	JE  L1
	
	;[DI]不为0,将其覆盖SI指向的位置;
	MOV AX,[DI]
	MOV [SI],AX
	ADD SI,2
	
L1: ADD DI,2
	LOOP AGAIN
	
	;结束复制,开始往后面填充0;
L2: CMP SI,DI
	JE  EXIT
	MOV AX,0
	MOV [SI],AX
	ADD SI,2
	JMP L2 	
	
	;后面部分是测试代码,与题目答案无关;	
EXIT:
	XOR CX,CX
	MOV CX,LEN
	
 	LEA DI,MEM
DISP:	
	MOV DX,30H
	ADD DX,[DI]
	MOV AH,2
	ADD DI,2
	INT 21H
	LOOP DISP
	
	;为什么直接用地址判断是否结束不行呢?;
	;代替LOOP;
	;MOV AX,OFFSET LEN
	;CMP DI,AX
	;JNE EXIT
	
   
    MOV AH,4CH
    INT 21H
    
CODES ENDS  
    END START


5.17 试编制一个程序把 AX 中的 16 进制数转换为 ASCII 码,并将对应的 ASCII 码依次存放 到 MEM 数组中的四个字节中。例如,当(AX)=2A49H 时,程序执行完后,MEM 中的 4 个 字节内容为 39H,34H,41H,32H。

算法:
代码:

在这里插入代码片
  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 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,则把其他两个数也清零。试编写此程序。
scau汇编综合性实验是一个非常有趣的项目,其中有一个实现在屏幕上移动的“蛇”的任务。我们可以使用汇编语言的指令来控制屏幕的输出和键盘输入。 首先,我们需要定义一个表示“蛇”的数据结构。可以使用一个数组来储存蛇的位置信息,每个元素表示一个身体部位的坐标。我们还需要定义一个变量来表示蛇的长度。 接下来,我们需要在屏幕上绘制“蛇”。我们可以使用汇编语言的命令来控制屏幕的像素,实现绘制功能。首先,我们需要清空屏幕上的内容,然后将“蛇”的每个身体部位的坐标对应的像素点设为特定颜色。 在屏幕上移动“蛇”的思路是,通过监听键盘输入来控制“蛇”的移动方向。当用户按下箭头键的时候,我们通过改变蛇头的坐标来实现移动。之后,我们还需要更新蛇身体的坐标信息,最后再次绘制“蛇”。 同时,要确保蛇的移动过程中不会碰到屏幕边界或者自身身体的其他部位。如果蛇头碰到屏幕边界或者自身身体的其他部位,游戏结束。 在游戏进行过程中,还可以加入一些额外的功能,比如蛇吃到食物后身体加长,每移动一步更新分数等。 这个“蛇”的移动实验可以让我们深入理解汇编语言的编程思想,锻炼我们的逻辑思维和创造力。同时,通过这个实验,我们可以将计算机相关知识与生活中的游戏联系起来,更加直观地感受到计算机的奇妙之处。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值