目录
- 5.5* 试编写一程序,要求能从键盘接收一个个位数 N,然后响铃 N 次(响铃的 ASCII 码为 07)。
- 5.6 * 编写程序,将一个包含有 20 个数据的数组 M 分成两个数组:正数数组 P 和负数数组 N, 并分别把这两个数组中数据的个数显示出来。
- 5.7* 试编写一个汇编语言程序,求出首地址为 DATA 的 100D 字数组中的最小偶数,并把它 存放在 AX 中。
- 5.8 把 AX 中存放的 16 位二进制数 K 看作是 8 个二进制的“四分之一字节”。试编写程序 要求数一下值为 3(即11B)的四分之一字节数,并将该数(即 11B 的个数)在终端上显示出来。
- 5.12 有一个首地址为 MEM 的 100D 字数组,试编制程序删除数组中所有为 0 的项,并将后续项向前压缩,最后将数组的剩余部分补上 0。
- 5.17 试编制一个程序把 AX 中的 16 进制数转换为 ASCII 码,并将对应的 ASCII 码依次存放 到 MEM 数组中的四个字节中。例如,当(AX)=2A49H 时,程序执行完后,MEM 中的 4 个 字节内容为 39H,34H,41H,32H。
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。
算法:
代码:
在这里插入代码片