【发布时间】:2018-06-07 15:02:03
【问题描述】:
所以我在我的组装 8086 框中遇到了一个示例,我可以使用一些帮助来完成代码
所以例子是这样的:有一个整数数组,计算数组中偶数元素的个数
.model small
.stack
.data
arr dw 10 dup (1,2,3,4,5,6,7,8,9,10)
msg db 'number of even elements is:', '$' ;;
.code
;printing
print proc a:word
push bp
mov bp, sp
mov ax, a
mov cx, 10
mov bx, 0
cmp ax, 0
jne begin
mov dl, 0
add dl, '0'
mov ah, 2
int 21h
jmp toend
begin:
cmp ax, 0
je print
mov dx, 0
div cx
push dx
inc bx
jmp begin
print:
cmp bx, 0
je kraj
pop dx
add dl, '0'
mov ah, 2
int 21h
dec bx
jmp print
toend:
mov dl, 10
mov ah, 2
int 21h
pop bp
ret 2
print endp
main:
mov ax, @data
mov ds, ax
mov ax, ;number
call print
jmp fin
我查看了一些以前的代码,并试图以某种方式使其工作..
所以我的问题是我是否走在正确的道路上,我应该使用idiv 指令还是?
编辑: 结果,除了“21243”之外,我似乎无法得到其他任何东西,顺便说一下,我试图计算一些其他的东西并在这个过程中迷失了方向,这是完整的代码:
; there is an array of integers. calculate the number of
; even elements in the array.
.model small
.stack
.data
arr dw 10 dup (1,2,3,4,5,6,7,8,9,10)
msg db 'Average (in procents): ', '$'
msg1 db 'Average of even elements: ', '$'
msg2 db 'Sum is:', '$' ;;
msg3 db 'Number of even elements is :', '$' ;;
limit dw ? ; length * 2, because we save dw (length of 2 bytes)
number dw 2345 ;;
sum dw 0 ;;
.code
print proc a:word
push bp
mov bp, sp
mov ax, a
mov cx, 10
mov bx, 0
cmp ax, 0
jne begining
mov dl, 0
add dl, '0'
mov ah, 2
int 21h
jmp toend
begining:
cmp ax, 0
je print
mov dx, 0
div cx
push dx
inc bx
jmp begining
print:
cmp bx, 0
je toend
pop dx
add dl, '0'
mov ah, 2
int 21h
dec bx
jmp print
toend:
mov dl, 10
mov ah, 2
int 21h
pop bp
ret 2
print endp
main:
mov ax, @data
mov ds, ax
mov ax, number
call print
jmp fin
shl ax, 1 ;mul 2
mov limit, ax
mov bx, 0
mov cx, 2
poc:
cmp bx, limit
je k
mov ax, arr[bx]
;mov dx, 0 ;
;div cx ;
cwd
idiv cx ;signed division
cmp dx, 0
jne jumpp
mov ax, number
inc ax
mov number, ax
mov ax, sum
add ax, arr[bx]
mov sum, ax
jumpp:
add bx, 2 ;because 'length' of elements is 2 bytes
jmp poc
k:
mov ax, 100
mov bx, number
mul bx
mov dx, 0 ; xor dx, dx
mov bx, length arr ; length of array = 10 so this is mov bx, 10
div bx
mov es, ax
mov dl, offset msg
mov ah, 9
int 21h
mov ax, es
push ax
call print
; mov dl, offset msg2
; mov ah, 9
; int 21h
mov ax, sum
push ax
call print
; mov dl, offset msg3
; mov ah, 9
; int 21h
mov ax, number
push ax
call print
; mov dl, offset msg1
; mov ah, 9
; int 21h
mov ax, sum
mov dx, 0
cwd
mov bx, number
cmp bx, 0
je here
idiv number
push ax
call print
jmp fin
here:
mov dl, 0
add dl, '0'
mov ah, 2
int 21h
fin:
mov ah, 4ch
int 21h
end main
【问题讨论】:
-
div cx和cx=10显然会除以 10 而不是 2。你甚至从不使用结果。虽然在一般情况下使用除法很好,但对于 2 的幂,您通常使用按位运算。 -
这对除以 2 有效吗?
mov cx, 2 ;; idiv cx ;; push ax -
是的,这会起作用,尽管目前还不清楚为什么要将结果推送到堆栈,特别是因为您的问题标题显示为“count”。
-
没有一个需要在堆栈上保存商。
-
计算偶数的最佳方法可能是计算奇数并执行
even = length - odd。奇数设置了低位,因此您可以使用odd += (*p++) & 1。例如lodsw/and ax, 1/add dx, ax.
标签: arrays assembly x86-16 emu8086