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



我试图在MASM x86上找到两个用户输入数字的平均值(im使用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的平均值(或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

例如CCD_ 3。


idiv的问题:

idiv没有采用立即数操作数的形式。被除数是隐式的,除数是一个显式的操作数。商在AL中,余数在AH中。(这与AAM相反,后者接受立即数操作数,但只除AL,不除AX)。

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

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

对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位,并将答案存储在"结果"中

最新更新