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
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值