gpt4 book ai didi

assembly - 10 个用户在汇编中输入数字的平均值

转载 作者:行者123 更新时间:2023-12-02 19:13:31 25 4
gpt4 key购买 nike

这段汇编代码应该计算 10 个用户输入的 4 位数字的平均值,但我不知道为什么无论我输入什么数字,它总是给我 2340 作为平均值。

data segment
sum dw 2dup(0)
msg1 db 'Enter 10 numbers:', 0dh,0ah,'$'
msg2 db 'Average= ','$'
ends

stack segment
dw 10dup(0)
ends

code segment
assume cs:code,ds:data,ss:stack
main proc far

mov ax, data
mov ds, ax

mov ax, stack
mov ss, ax

mov ah, 09h
mov dx, offset msg1
int 21h

mov ch, 10

NextNumber:
mov cl, 4
mov di, 0

get:
mov ah, 07h
int 21h

cmp al, 30h
jb get
cmp al, 39h
ja get

mov ah, 02h
mov dl, al
int 21h

sub al, 30h

mov bl, al
mov ax, 10
mul di

mov bh, 0
add ax, bx

mov di, ax

dec cl

jnz get

add sum, di
mov sum+2, 0
adc sum+2, 0

mov ah, 02h
mov dl, 0ah
int 21h
mov dl, 0dh
int 21h

dec ch

jnz NextNumber

mov dx, sum+2
mov ax, sum
mov bx, 10
div bx

mov ah, 09h
mov dx, offset msg2
int 21h

mov cx, 4
mov bx, 10

next1: mov dx, 0
div bx

push dx

dec cx
jnz next1

mov cx,4

next2: pop dx
add dl, 30h
mov ah, 02h
int 21h

dec cx
jnz next2

mov ah, 4ch
int 21h

main endp

ends

end main

最佳答案

stack segment
dw 10 dup (0)
ends

这么小的堆栈是行不通的......

mov ax, stack
mov ss, ax

...当然,除非您忘记设置 SP 寄存器,因为现在程序可以认为它有足够大的堆栈。

add sum, di
mov sum+2, 0
adc sum+2, 0

上面的代码片段显示了第一个问题。您不想连续将 sum 变量的高位字清零。只需删除 mov sum+2, 0 行即可。 sum 变量位于数据段中,并被编译器初始化为零。因此,无需运行时工作即可从零开始。

mov dx, sum+2
mov ax, sum
mov bx, 10
div bx

mov ah, 09h
mov dx, offset msg2
int 21h

这段代码片段显示了第二个问题。您设法计算平均值并将其存入 AX 寄存器,但随后您通过调用 DOS 函数来显示消息来破坏 AX 寄存器!只需颠倒这些操作的顺序即可。所以先显示,再计算平均值。

关于assembly - 10 个用户在汇编中输入数字的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29706341/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com