编写程序用来分别统计一组数中奇数和偶数的个数,数据和结果均在数据段中。使用汇编语言
时间: 2024-02-17 13:03:23 浏览: 114
下面是汇编语言的代码,用来统计一组数中奇数和偶数的个数:
```
DATA SEGMENT
NUMS DB 3, 6, 8, 11, 2, 9, 13, 7, 4, 5
ODD_COUNT DB 0
EVEN_COUNT DB 0
DATA ENDS
CODE SEGMENT
START:
MOV AX, DATA
MOV DS, AX
MOV CX, 10
MOV BL, 1
LOOP_START:
MOV AL, NUMS[SI]
INC SI
TEST AL, BL
JZ EVEN
INC ODD_COUNT
JMP CONTINUE
EVEN:
INC EVEN_COUNT
CONTINUE:
LOOP LOOP_START
MOV AH, 4CH
INT 21H
CODE ENDS
END START
```
这段代码假设数据段中的 "NUMS" 数组包含了一组十个数据,代码会遍历这个数组,检查每个数据是否为奇数,如果是,就将 "ODD_COUNT" 计数器加一,否则将 "EVEN_COUNT" 计数器加一。最终,程序会在 "EVEN_COUNT" 和 "ODD_COUNT" 中存储分别是偶数和奇数的个数。
相关问题
用汇编语言编写一段程序,分别统计在内部RAM的20H~40H单元的数据区中奇数和偶数的个数,并将奇数和偶数的个数分别存放在50H和51H单元中。
下面是一段用汇编语言编写的程序,可以实现上述功能:
```
ORG 0H ; 程序起始地址为0H
MOV R0, #20H ; 将20H存入寄存器R0
MOV R1, #0H ; 初始化偶数计数器为0
MOV R2, #0H ; 初始化奇数计数器为0
LOOP:
MOV A, @R0 ; 将R0指向的内部RAM单元中的数据存入累加器A
ANL A, #01H ; 判断A是否为奇数
JZ EVEN ; 如果是偶数,则跳转到EVEN标签
INC R1 ; 偶数计数器加1
SJMP CONTINUE ; 继续执行程序
EVEN:
INC R2 ; 奇数计数器加1
CONTINUE:
INC R0 ; R0加1,指向下一个内部RAM单元
CJNE R0, #41H, LOOP ; 如果R0没有到达41H,则跳转到LOOP标签继续执行程序
MOV @50H, R1 ; 将偶数计数器的值存入50H单元
MOV @51H, R2 ; 将奇数计数器的值存入51H单元
END ; 程序结束
```
这段程序通过循环遍历20H~40H单元的数据区,判断每个数据是否为奇数,并分别累加奇数和偶数的个数。最后将计数器的值分别存放在50H和51H单元中。
8086汇编语言中,给定一个10字节的字节型数组varb db 15,-25,66,-17,78,-33,46,-96,71,80,编写一个完整的源程序,统计数组中奇数和偶数的个数,统计结果分别保存在ODDNUM和EVENNUM单元中
下面是一个完整的8086汇编语言源程序,用于统计给定的10字节字节型数组中奇数和偶数的个数,并将结果分别保存在ODDNUM和EVENNUM单元中:
```
.model small
.stack 100h
.data
varb db 15,-25,66,-17,78,-33,46,-96,71,80
ODDNUM dw ?
EVENNUM dw ?
.code
main proc
mov ax, @data
mov ds, ax
mov cx, 10 ; 数组元素个数
mov bx, 0 ; 计数器清零
; 统计奇数个数
mov si, offset varb
mov ax, 0 ; 奇数计数器清零
again1:
mov dl, [si]
and dl, 1 ; 判断是否为奇数
jnz is_odd ; 是奇数
inc si ; 指向下一个元素
loop again1
jmp end_count
is_odd:
inc ax ; 奇数计数器加1
inc si ; 指向下一个元素
loop again1
; 统计偶数个数
mov si, offset varb
mov ax, 0 ; 偶数计数器清零
again2:
mov dl, [si]
and dl, 1 ; 判断是否为奇数
jz is_even ; 是偶数
inc si ; 指向下一个元素
loop again2
jmp end_count
is_even:
inc ax ; 偶数计数器加1
inc si ; 指向下一个元素
loop again2
end_count:
mov ODDNUM, ax ; 保存奇数个数
mov EVENNUM, bx ; 保存偶数个数
mov ah, 4ch
int 21h
main endp
end main
```
程序首先声明了一个包含10个元素的字节数组varb,以及两个用于存储奇数和偶数个数的双字单元ODDNUM和EVENNUM。然后,在main过程中,程序使用MOV指令将DS寄存器设置为数据段的基地址,使用MOV指令将CX寄存器设置为数组元素的个数(即10),使用MOV指令将BX寄存器清零,以便统计偶数个数。
接下来,程序使用MOV指令将SI寄存器设置为数组varb的基地址,使用MOV指令将AX寄存器清零,以便统计奇数个数。程序使用一个循环来遍历数组中的每个元素。在循环中,程序首先使用MOV指令将DL寄存器设置为当前元素的值,然后使用AND指令将DL寄存器与1进行按位与运算,以判断当前元素是否为奇数。如果是奇数,程序使用INC指令将AX寄存器加1,以统计奇数个数。程序使用INC指令将SI寄存器指向下一个元素,并使用LOOP指令来判断是否遍历完了数组中的所有元素。如果没有遍历完,程序将跳转回循环的开头,继续处理下一个元素。
当程序遍历完数组中的所有元素后,程序使用JMP指令跳转到end_count标签处。在end_count标签处,程序使用MOV指令将AX寄存器的值保存到ODDNUM单元中,以保存奇数个数。然后,程序使用MOV指令将SI寄存器重新设置为数组varb的基地址,使用MOV指令将AX寄存器清零,以便统计偶数个数。程序使用一个类似的循环来统计偶数个数,并使用MOV指令将BX寄存器的值保存到EVENNUM单元中,以保存偶数个数。
最后,程序使用INT 21h中断结束程序的执行。
阅读全文