添加四个数字并在汇编中查找平均值

时间:2014-09-25 23:40:15

标签: string assembly output add average

努力拓宽我的编程技巧。完成python,c ++,java和一点点cobol但是汇编让我感到困惑。试图制作一个程序,用单独的对话框提示和输入四个等级,并计算等级的总和和平均值(总和/ 4)。代码:

.586
.MODEL FLAT

INCLUDE io.h            ; header file for input/output

.STACK 4096

.DATA
number1 DWORD   ?
number2 DWORD   ?
number3 DWORD   ?
number4 DWORD   ?
four    DWORD   4
prompt1 BYTE    "Enter first number", 0
prompt2 BYTE    "Enter second number", 0
prompt3 BYTE    "Enter third number",0
prompt4 BYTE    "Enter fourth number",0
string  BYTE    40 DUP (?)
resultLbl BYTE  "The sum is", 0
resultAvg BYTE  "The average is",0
sum     BYTE    11 DUP (?), 0
avg     BYTE    11 DUP (?), 0

.CODE
_MainProc PROC
        input   prompt1, string, 40      ; read ASCII characters
        atod    string          ; convert to integer
        mov     number1, eax    ; store in memory

        input   prompt2, string, 40      ; repeat for second number
        atod    string
        mov     number2, eax

        input   prompt3, string, 40
        atod    string
        mov     number3, eax

        input   prompt4, string, 40
        atod    string
        mov     number4, eax

        mov     eax, number1    ; first number to EAX
        add     eax, number2    ; add second number to EAX
        add     eax, number3    ; add third number to EAX
        add     eax, number4    ; add fourth number to EAX
        mov     ax, eax         ; copy eax's value into ax (does this take eax's value away from eax?)
        mov     al, four        ; put's 4 into al
        idiv    al,             ; divides sum by ax(4)
        dota    avg, ax         ; convert to ASCII characters
        dtoa    sum, eax        ; convert to ASCII characters
        output  resultLbl, sum          ; output label and sum
        output resultAvg, avg               ; output label and avg

        mov     eax, 0  ; exit with return code 0
        ret
_MainProc ENDP
END                             ; end of source code

不知道我在哪里错了。它编译并运行,但只询问2个数字,然后返回这2个数字的总和。非常感谢任何和所有帮助

1 个答案:

答案 0 :(得分:0)

不能说是什么导致只请求2个号码,只有在没有io.h的情况下输出的总和。那个是从哪里来的?代码是有道理的。

ax寄存器只有16位。如果您的宏需要eax中的数字,那么您就会被打破。

你可能想要一个32位的红利和结果。坚持使用32位指令最简单:

cdq               ; sign extends eax into the edx register
idiv four         ; divide edx:eax by four.  Result is in eax.

向右转2位更简单!这也除以4。

sar ax, 2