[英]assembly 8086, count even numbers in array
所以我在包装盒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
走在正确的道路上,还是应该使用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
mov ax, number call print jmp fin
现在不要考虑算偶数。 首先,您需要正确显示数字。
同样由于jmp fin
指令,无论如何都不会执行任何其他指令。
您的打印过程有几个问题:
您以ret 2
结束它,这意味着应该使用堆栈中压入的单词大小的参数来调用它,但是没有!
您已通过AX
寄存器传递了参数,但几乎立即就用mov ax, a
将其销毁mov ax, a
。
您的打印过程包含一个具有相同名称print的标签。 知道emu8086是一种损坏的软件,所以我不告诉您call print
指令到达了程序或标签。
下一个代码应该工作。 验证它是否正确并在其上构建。 在其中添加一些小东西(仅几行代码),直到它按预期工作为止,不要继续添加更多东西!
.model small
.stack
.data
number dw 2345
.code
; IN (ax) OUT () MOD (ax,bx,cx,dx)
print:
mov cx, 10 ; Constant divider
mov bx, 0 ; Count pushes
divide:
mov dx, 0 ; Dividing DX:AX
div cx
push dx
inc bx
cmp ax, 0
jne divide
show:
pop dx ; Always at least 1 pop here
add dl, '0'
mov ah, 02h ; DOS.DisplayCharacter
int 21h
dec bx
jnz show
mov dl, 10 ; Linefeed, Don't you need carry return (13) too?
mov ah, 02h
int 21h
ret
main:
mov ax, @data
mov ds, ax
mov ax, number
call print
jmp fin
...
fin:
mov ax, 4C00h ; DOS.Terminate
int 21h
end main
要进一步阅读并更好地理解上面的代码为何起作用,请参阅使用DOS显示数字
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.