用汇编语言写一个程序,要求如下在内存已定义好一个容量为50字节的数组,请将数组中为0和为1的项找出,统计0和1的个数,并删除数组中所有为零的项,删除的项去掉不要,将后续项向前压缩
时间: 2024-01-22 09:19:38 浏览: 128
汇编课后作业答案_第三、四次1
以下是使用汇编语言实现的程序,可以满足您的要求:
```
ORG 100h
MOV CX, 50 ; 初始化计数器
; 统计0和1的个数
MOV SI, 0 ; SI为数组下标
MOV BL, 0 ; BL为0的个数
MOV BH, 0 ; BH为1的个数
LOOP1:
CMP SI, CX ; 判断是否遍历完整个数组
JE FINISH ; 如果已经遍历完整个数组,跳到FINISH标签
MOV AL, [BX+SI] ; 读取数组中的一个元素
CMP AL, 0 ; 判断是否为0
JE IS_ZERO ; 如果是0,跳到IS_ZERO标签
INC BH ; 如果不是0,BH加1
JMP CONTINUE ; 跳到CONTINUE标签
IS_ZERO:
INC BL ; 如果是0,BL加1
JMP CONTINUE ; 跳到CONTINUE标签
CONTINUE:
INC SI ; SI加1
JMP LOOP1 ; 继续循环
; 删除数组中所有为0的项,并将后续项向前压缩
FINISH:
MOV SI, 0 ; SI为数组下标
LOOP2:
CMP SI, CX ; 判断是否遍历完整个数组
JE END ; 如果已经遍历完整个数组,跳到END标签
MOV AL, [BX+SI] ; 读取数组中的一个元素
CMP AL, 0 ; 判断是否为0
JE DELETE ; 如果是0,跳到DELETE标签
INC SI ; 如果不是0,SI加1,继续循环
JMP LOOP2
DELETE:
MOV DI, SI ; DI为删除元素的位置
MOV CX, 1 ; CX为删除元素后的元素向前移动的距离
MOV BX, SI ; BX为当前元素的位置
ADD BX, 1 ; BX为下一个元素的位置
MOV DL, [BX] ; DL为下一个元素的值
MOV [DI], DL ; 将下一个元素的值复制到当前元素的位置
ADD SI, 1 ; SI加1,继续循环
JMP LOOP2
; 显示结果
END:
MOV AH, 09h ; 显示字符串
MOV DX, OFFSET RESULT1
INT 21h
MOV DL, BL ; 显示0的个数
ADD DL, 30h ; 转换成字符
MOV AH, 02h ; 显示字符
INT 21h
MOV AH, 09h ; 显示字符串
MOV DX, OFFSET RESULT2
INT 21h
MOV DL, BH ; 显示1的个数
ADD DL, 30h ; 转换成字符
MOV AH, 02h ; 显示字符
INT 21h
MOV AH, 4Ch ; 程序结束
INT 21h
; 数据区
ARRAY DB 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
RESULT1 DB '0的个数:$'
RESULT2 DB '1的个数:$'
```
程序的思路如下:
1. 使用循环遍历整个数组,统计0和1的个数。
2. 再次使用循环遍历整个数组,删除数组中所有为0的项,并将后续项向前压缩。
3. 显示0和1的个数。
请注意,此程序的数组已经在数据区中定义好了。如果您需要测试不同的数组,请修改数据区中的ARRAY数组。
阅读全文