1、题目描述:
编写程序,将一个包含有20个数据的数组M分成2个数组:正数数组P和负数数组N,并分别把这两个数组中数据的个数显示出来。
DATAS SEGMENT
M DB 4 DUP(8,-2,2,-3,-5)
P DW 0
N DW 0
S1 DB "The number of positive numbers:",'$'
S2 DB 13,10,"The number of negative numbers:",'$'
DATAS ENDS
STACKS SEGMENT
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
LEA SI,M
MOV CX,20
L: MOV AL,[SI]
CMP AL,0;每个数跟0比较
JL L1 ;负数jmp到L1
JG L2 ;正数jmp到L2
L1:
INC N
JMP L3
L2:
INC P
JMP L3
L3: INC SI
LOOP L
LEA DX,S1
MOV AH,9
INT 21H
LEA DI,P
MOV AX,[DI];输出正数的个数
MOV BL,10d
DIV BL
MOV DL,AL
MOV BH,AH
ADD DL,30H
MOV AH,2
INT 21H
MOV DL,BH
ADD DL,30H
MOV AH,2
INT 21H
LEA DX,S2
MOV AH,9
INT 21H
LEA DI,N
MOV AX,[DI];输出负数的个数
MOV BL,10d
DIV BL
MOV DL,AL
MOV BH,AH
ADD DL,30H
MOV AH,2
INT 21H
MOV DL,BH
ADD DL,30H
MOV AH,2
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
解题思路:
①定义一个数组装进20个数。②定义两个数组装载正负数的个数,每个数组只装一个数而且占两字节,即这数最多为双位数。则个位数在AL中,十位数在AH中。
2、题目描述:
试编写一段程序,求出首地址为DATA的100D字数组中的最小偶数,并把它存放在AX中。
DATAS SEGMENT
DATA DW 10 DUP(5,6,-4,-5,8,9,10,188,-178,-255)
COUNT DW ($-DATA)/2;数据长度,注意此处算长度,因为用字来定义数组,字占两字节
COUNT1 DW 0
DATAS ENDS
STACKS SEGMENT
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV CX,COUNT
LEA SI,DATA-2
L1: ADD SI,2 ;寻找第一个偶数放在AX
MOV AX,[SI]
DEC CX
TEST AL,01H ;若最后一位为0说明是偶数
JNZ L1
L2: ADD SI,2 ;寻找第二个偶数放在BX
MOV BX,[SI]
CMP CX,0 ;如果到达数组的末尾则退出
JZ L4
DEC CX
TEST BL,01H
JNZ L2
CMP AX,BX
JG L3
JMP L2
L3: MOV AX,BX ;AX>BX,两者交换寄存器内容
JMP L2
L4: MOV AH,4CH ;程序退出
INT 21H
CODES ENDS
END START
解题思路:
①采用两个寄存器装数据,将最小的偶数放在AX寄存器。②先将初始的偶数当成是最小的偶数,后面遇到的偶数放在BX寄存器中,若AX<BX,继续取下一个偶数;若AX>BX,则将BX寄存器的内容放入AX中,继续取下一个偶数,直至所有偶数都取完。
3、题目描述:
有一个首地址为mem的100个字的数组,试编制程序删除数组中所有为零的项,并将后续项向前压缩,最后将数组的剩余部分补上零。
在这里插入代码片
4、题目描述:
在首地址为DATA的字数组中,存放了100H个16位补码数,试编写一个程序,求出它们的平均值放在AX寄存器中;并求出数组中有多少个数小于此平均值,将结果放在BX寄存器中。
DATAS SEGMENT
DATA DW 100 DUP(-1,2,3,4,5,6,7,8,-9,-10)
COUNT DW ($-DATA)/2;数据个数
DATAS ENDS
STACKS SEGMENT
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV DX,0
MOV DI,0
MOV BX,0
MOV CX,COUNT
LEA SI,DATA
L: MOV AX,[SI];计算数组里数的总和
CWD;符号扩展,16位的字加法运算,需扩展成32位双字,即AX->DX:AX
ADD BX,AX;低位相加
ADC DI,DX;高位含进位加法
ADD SI,2
LOOP L
MOV AX,BX;求得平均值放在AX
MOV DX,DI
MOV BX,COUNT
IDIV BX ;补码数是带符号数,余数在DX中,商在AX中
LEA SI,DATA
MOV CX,COUNT
MOV BX,0
L1: MOV DX,[SI];判断有多少个小于平均值的数,把个数放在BX
CMP AX,DX
JLE L3
JG L2
L2: INC BX
L3:
ADD SI,2
LOOP L1
FINAL:
MOV AH,4CH
INT 21H
CODES ENDS
END START
解题思想:求累加,字数据要扩展成双字。求得的平均数要依次与数组里的原来的数据作比较,求出个数,先把数组首地址放在某一寄存器中,然后取出即可,取下一数据则地址加一。
5、题目描述:
已知数组A包含15个互不相等的整数,数组B包含20个互不相等的整数。试编制一个程序,把既在A中又在B中出现的整数存放于数组C1中。
DATAS SEGMENT
BUFA db 1,3,5,7,9,21,21,21,21,21,21,21,21,21,21;??不是字数组吗,为什么不用dw
count1 dw $-BUFA;数据个数
BUFB db 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
count2 dw $-BUFB;数据个数
BUFC db 15 dup(?)
DATAS ENDS
STACKS SEGMENT
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
lea di,BUFC
mov cx,count1
mov bx,0
L:
push cx
mov al,BUFA[bx]
inc bx
mov cx,count2
lea si,BUFB
L2:
mov dl,[si]
inc si
cmp al,dl
jz L3 ;相等则将数据放入BUFC中,将BUFA的数依次与BUFB的数比对,BUFA的每一个数都与BUFB的所有数比对完,再对BUFA的下一个数进行上述操作
loop L2
jmp L4
L3:
mov [di],dl
inc di
L4:
pop cx;后原CX-1,根据后面的loop
loop L
MOV AH,4CH
INT 21H
CODES ENDS
END START
解题思路:
6、题目描述:
以下面形式定义一个长整数,其所占用字节数由N得到,比如128位的数5746352413DE89674523BC9A78563412H定义成:
NUM DB 12H,34H,56H,78H,9AH,0BCH,23H,45H
DB 67H,89H,0DEH,13H,24H,35H,46H,57H
N DB $-NUM
试编写一个程序,实现对N字节的NUM的值求补,并把求补后的值仍保存在NUM中。
在这里插入代码片
7、题目描述:
LINK指向一个字线性表,其中的首单元保存线性表的长度,编一个程序,将该线性表中的0FFFFH项删除。
DATAS SEGMENT
link dw 7,0ffffh,2,3,4,5,6,8;首单元保存线性表长度
buffer dw 7 dup(0);
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
MOV BX,0
LEA SI,LINK
MOV CX,[SI] ;线性表长度存入CX
LEA DI,BUFFER+2;
L: ADD SI,2
MOV AX,[SI]
CMP AX,0FFFFH
JNZ CUN
LOOP L
JMP FUZHI
CUN:MOV [DI],AX
ADD DI,2
INC BX ;记录不等于要删除项0ffffh的项的个数
LOOP L
FUZHI:
LEA SI,BUFFER
MOV [SI],BX
LEA DI,LINK
MOV CX,BX
L2: ADD SI,2
ADD DI,2
MOV AX,[SI]
MOV [DI],AX
LOOP L2
MOV AH,4CH
INT 21H
CODES ENDS
END START
解题思路:将原线性表中不需要删除的项的内容装在一个寄存器中,然后把寄存器内容依次复制回原来的线性表中。
8、题目描述:
试编写一段程序,要求在长度为100H字节的数组中,找出大于42H的无符号数的个数并存入字单元UP中;找出小于42H的无符号数的个数并存入字单元DOWN中。
DATAS SEGMENT
ARRAY DB 64 DUP(25H,43H,41H,78h)
UP DW 0
DOWN DW 0
DATAS ENDS
STACKS SEGMENT
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
LEA SI,ARRAY
MOV CX,100H
C0:
MOV AL,[SI]
CMP AL,42H
JB C1
JNB C2
C1:
INC DOWN
JMP C3
C2:
INC UP
JMP C3
C3:
INC SI
LOOP C0
MOV AH,4CH
INT 21H
CODES ENDS
END START
解题思路:注意100H字节长度=256字节,在定义数组时切勿弄错。