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

时间:2016-05-16 05:01:54

标签: assembly average masm emu8086

我试图在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

2 个答案:

答案 0 :(得分:3)

只需将您的号码添加到注册表中即可。如果它们足够小,总和不会溢出,那就很容易了。

如果您提前知道您只是平均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

e.g。 '5' + '8' = 0x6d. 0x6d>>1 = 0x36 = '6'

idiv

的问题

没有form of idiv采用立即操作数。被除数是隐含的,除数是一个显式操作数。商在AL中,其余的在AH中。 (这与AAM相反,它接受一个立即操作数,但只划分AL,而不是AX。)

请参阅this answer to another question我演示使用divaam将整数转换为两位ASCII数字(并使用DOS系统调用打印它们,因为这是该问题的OP所需要的)。

另请参阅代码wiki中的其他链接。

答案 1 :(得分:-1)

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

这:http://www.electronics.dit.ie/staff/tscarff/8086_instruction_set/8086_instruction_set.html#IDIV 说你会加载'结果'进入AX然后只是去idiv 2,结果将进入AL。所以我猜你试试

;add al, num1

movzx ax, al
mov   dl, 2
idiv  dl
然后,AL将包含除法的结果(商)和AH的余数。

或者,因为你除以2,你应该向右移1。目的地可以是寄存器或记忆

shr result,1

将改变结果'正确1位并将答案存储在'结果'