如何计算平均值? (masm x86 8086)

How to calculate average? (masm x86 8086)

我试图在 MASM x86(我使用 8086)上求两个用户输入数字的平均值。我似乎无法计算平均值!我可以让这两个数字相乘,但我不知道如何将它们相加然后除以数字总数(在我的例子中它只有 2)。这是我到目前为止所拥有的(是的,我意识到我正在乘法,但这只是为了表明我确实尝试了一些东西,我只是不能让他们加法和除法):

.model small
org 100h
.data

num1 db ?
num2 db ?
result db ? 
usermsg db "Enter EVEN numbers only.$"
msg1 db 13, 10, "Enter first number: $"
msg2 db 13, 10, "Enter second number: $"
msg3 db 13, 10, "The average is: $"

.code

main proc
mov ax, @data
mov ds, ax

lea dx, usermsg
mov ah, 09h
int 21h

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

mov ah, 01h
int 21h

sub al, '0'
mov num1, al 
mov dl, al

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

mov ah, 01h
int 21h
sub al, '0'
mov num2, al

mul num1


;add al, num1

mov result, al


idiv result, 2 ;new code
aam

add ah, '0'
add al, '0'
mov bx, ax

lea dx, msg3
mov ah, 09h
int 21h

mov ah, 02h
mov dl, bh
int 21h
mov dl, bl
int 21h

mov ax, 4c00h
int 21h

不太了解 asm,但你确定你可以那样使用 idiv 吗?

这个:http://www.electronics.dit.ie/staff/tscarff/8086_instruction_set/8086_instruction_set.html#IDIV 说你会将 'result' 加载到 AX 中,然后只转到 idiv 2,结果将放入 AL。所以我想你会尝试

;add al, num1

movzx ax, al
mov   dl, 2
idiv  dl

AL 将包含除法的结果(商),AH 将包含余数。


或者,因为您要除以 2,所以您应该右移 1。目标可以是寄存器或内存

shr result,1

将'result'右移1位并将答案存储在'result'中

只需在寄存器中添加您的数字并相除即可。如果它们足够小,总和不会溢出,那就很容易了。

如果您提前知道您只是对 2 个数(或 2 的任何幂)求平均值,请使用移位进行除法。

...  your original code that gets two digits from the user
sub   al, '0'
; first number in [num1] in memory, second number in al
; We know they're both single-digit numbers, so their sum will fit in 8bits


add   al, [num1]    ; or whever you put num1: a register like cl would be a good choice, instead of memory
shr   al, 1         ;  al = al/2  (unsigned)

;; al holds the average.  Do whatever else you want.

mov   [result], al  
add   al, '0'       ; convert back to ASCII

您可以平均两个 ASCII 数字而无需减去并重新添加 '0',以节省指令。如果 asc='0'(即 0x30),则

  (a+asc + b+asc) / 2
= (a+b)/2 + (asc+asc)/2
= (a+b)/2 + asc        i.e. the average as an ASCII digit

因此:

add  al, [asciidigit1]
shr  al, 1

例如'5' + '8' = 0x6d. 0x6d>>1 = 0x36 = '6'.


您的 idiv 问题:

没有form of idiv that takes an immediate operand. The dividend is implicit, and the divisor is the one explicit operand. The quotient goes in AL, and the remainder goes in AH. (This is the opposite of AAM,它接受一个立即操作数,但只除以 AL,而不是 AX。

请参阅 ,其中我演示了使用 divaam 将整数转换为两个 ASCII 数字(并使用 DOS 系统调用打印它们,因为这就是它的 OP想要的问题)。

另请参阅 标签 wiki 中的其他链接。