尝试编写一段代码,生成一个包含14天随机温度读数的数组。然后输出这14天的最高温、最低温以及平均温度

编程语言 2026-07-12

我正在尝试编写一个代码,用来生成一个包含14天温度读数的随机数组;每天11次读数。然后计算每天的最高/最低温度,以及计算该数组的平均最高/最低温度。我觉得自己在某个循环里卡住了,但不确定具体在哪里。当我运行调试器时,初始化部分工作正常,但其他都不起作用。我折腾过它,通常可以让display Temp array和 display Temp With Strings显示出来,但在计算、数组以及每日最高和最低温度的处理上有很大困难。

INCLUDE Irvine32.inc


DAYS_MEASURED   =    14     
TEMPS_PER_DAY   =    11
MIN_TEMP    =    20
MAX_TEMP    =    80 
ARRAY_SIZE  =    DAYS_MEASURED * TEMPS_PER_DAY

.data
temp_array      DWORD   ARRAY_SIZE DUP(?)
high_daily      DWORD   DAYS_MEASURED DUP(?)
low_daily       DWORD   DAYS_MEASURED DUP(?)
high_ave        DWORD   ?
low_ave         DWORD   ?

program_title   BYTE    "This is Fun with Temperature Calculations.   ",0               
program_name    BYTE    "My name is Rachelle.",13,10,0                                  
program_desc    BYTE    "This program will generate different temperature readings per day for a certain amount of days and will return the list of " 
                BYTE    "temperatures, highest and lowest temperatures per day and the average high and low temperatures per day.",13,10, 0
array_title     BYTE    "The temperature readings per day were: ",13,10,0               
high_temp       BYTE    "The highest temperatures per day was: ", 13,10,0               
low_temp        BYTE    "The lowest temperatures per day was: ", 13,10, 0               
ave_hightitle   BYTE    "The average high temperature was: ", 0                         
ave_lowtitle    BYTE    "The average low temperature was: ",0                           

.code
main PROC

    ; random seed temperature generator
    call Randomize

    ; printgreeting
    PUSH OFFSET program_title
    PUSH OFFSET program_name
    PUSH OFFSET program_desc
    CALL printGreeting

    ; generateTemperatures
    PUSH OFFSET temp_array
    CALL generateTemperatures

    ; findDailyHighs
    PUSH OFFSET high_daily
    PUSH OFFSET temp_array
    CALL findDailyHighs

    ; findDailyLows
    PUSH OFFSET low_daily
    PUSH temp_array
    CALL findDailyLows

    ; displayTempArray
    PUSH TEMPS_PER_DAY
    PUSH DAYS_MEASURED
    PUSH OFFSET low_daily
    PUSH OFFSET low_temp
    push OFFSET high_daily
    push OFFSET high_temp
    PUSH OFFSET array_title
    PUSH OFFSET temp_array
    CALL displayTempArray

    ; displayTempWithStrings
    push OFFSET ave_hightitle
    push OFFSET high_ave
    PUSH OFFSET ave_lowtitle
    PUSH OFFSET low_ave
    CALL displayTempWithString
    Invoke ExitProcess,0    ; exit to operating system
main ENDP

printGreeting PROC
    PUSH    EBP                                      
    MOV EBP, ESP                                 
    PUSH    EDX                                      

_intro1:
    MOV EDX, [EBP+16]                            
    CALL    writeString                              
    MOV EDX, [EBP+12]                            
    CALL    writeString                              
    CALL    CrLf                                     
    MOV EDX, [EBP+8]                             
    CALL    writeString
        CALL    CrLf                                                                 

    POP EDX                                      
    POP EBP                                      
    RET 12                                       printGreeting ENDP

generate random temperatures?
    PUSH    EBP                                      
    MOV EBP, ESP                                 
    PUSHAD  
    MOV EDI, [EBP+8]                             
    MOV EBX, (MAX_TEMP - MIN_TEMP) + 1          
    MOV ECX,  ARRAY_SIZE                         

_generateloop:
    MOV EAX, EBX                                 
    CALL    RandomRange                              
    ADD EAX, MIN_TEMP                               
    MOV [EDI], EAX                               
    ADD EDI, 4                                   
    LOOP    _generateloop       

        POPAD                                        
        POP EBP                                                 
    RET 8   
generateTemperatures ENDP

findDailyHighs PROC

    PUSH    EBP                                      
    MOV EBP, ESP                                 
    PUSHAD                                       

    MOV EDI, [EBP+8]                             
    MOV ESI, [EBP+12]                            
    MOV ECX, DAYS_MEASURED      
_findHighs_loop:
        mov     ebx, TEMPS_PER_DAY
        mov     eax, [esi]   
        add     esi, 4
        dec     ebx
_findHighs_inner:
        cmp     eax, [esi]
        jge     _skipHigh
        mov     eax, [esi]
_skipHigh:
       add      esi, 4
       loop     _findHighs_inner
       mov      [edi], eax    ; Store max temperature for the day
       add     edi, 4
       loop    _findHighs_loop

    POPAD                                        
    POP EBP                                      
    RET 8                                        
findDailyHighs ENDP

findDailyLows PROC
    PUSH    EBP                                      
    MOV EBP, ESP                                 
    PUSHAD                                       

    MOV ESI, [EBP+8]                             
    MOV EDI, [EBP+12]                            
    MOV ECX, DAYS_MEASURED                       

    mov     edi, [ebp+8]  
        mov     esi, [ebp+12]

        mov     ecx, DAYS_MEASURED
_findLows_loop:
        mov     ebx, TEMPS_PER_DAY
        mov     eax, [esi]   
        add     esi, 4
        dec     ebx

_findLows_inner:
        cmp     eax, [esi]
        jle     _skipLow
        mov     eax, [esi]
_skipLow:
        add     esi, 4
        loop    _findLows_inner
        mov     [edi], eax 
        add     edi, 4
        loop    _findLows_loop

    POPAD                                    
    POP EBP                                      
    RET 8                                        

findDailyLows ENDP

calAverageLowHighTemps PROC
    PUSH    EBP                                      
    MOV EBP, ESP                             
    PUSHAD                                              

        xor     eax, eax
        mov     ecx, DAYS_MEASURED
_calcHighs_loop:
        add     eax, [esi]
        add     esi, 4
        loop    _calcHighs_loop

        div     ecx
        mov     [ebx], eax

        xor     eax, eax
        mov     ecx, DAYS_MEASURED
_calcLows_loop:
        add     eax, [edi]
        add     edi, 4
        loop    _calcLows_loop

        div     ecx
        mov     [edx], eax

    POPAD                                        
    POP EBP                                      
    RET 16                                       

calAverageLowHighTemps ENDP


displayTempArray PROC
    PUSH    EBP
    MOV EBP, ESP                                 
    PUSH    EDX

    MOV EDX, [EBP+12]                            
    CALL    writeString                              
    mov EDX, EDI                                 
    call    writeInt
    call    CrLf

    MOV EDX, [EBP+16]                            
    CALL    writeString                              
    MOV EDX, [EBP+20]
    CALL    writeInt
    call    CrLf
    MOV EDX, [EBP+24]                            
    CALL    writeString                              
    MOV EDX, [EBP+28]
    CALL    writeInt
    call    CrLf
    call    CrLf

    pop     edx
    pop     ebp
    ret
displayTempArray ENDP

displayTempWithStrings PROC
    PUSH    EBP
    MOV EBP, ESP                                 
    PUSHAD

    MOV EDX, [EBP+20]                               
    CALL    writeString                              
    mov EDX, [EBP+16]                                   
    call    writeInt
    call    CrLf

    MOV EDX, [EBP+12]                               
    CALL    writeString                              
    mov EDX, [EBP+8]                                    
    call    writeInt
    call    CrLf

    popad
    pop ebp
    Ret

    displayTempWithStrings ENDP

END main

解决方案

The printGreeting proc is ok, but to me it seems a bit convoluted with these three arguments. One argument to a single cartouche would be much cleaner.

现在真正的问题在程序的早期就开始出现!

  • For generating the temperatures you invoke generateTemperatures with a single argument, yet you return from it using ret 8. Your stack is already corrupted! (Also what about the incomplete procedure header?)
  • The findDailyHighs and findDailyLows procs are very similar, and indeed you copy-pasted here and left some redundant instructions while doing so! Several things got wrong:
  • You got source and destination reversed. The offset to the temperature array was pushed last, so that resides at [ebp+8] and must go to ESI.
  • The inner loop is set to perform one iteration too many. With 11 items there can be but 10 comparisons.
  • The inner loop can not be using the loop instruction. It is meant to use EBX instead (dec ebx jnz _inner)
  • The displayTempArray and displayTempWithStrings procs got lots of arguments (8 and 4) but both return through a naked ret. This leaves the arguments on the stack!
  • It's been a long time I looked at irvine's but does writeInt really expect EDX for its argument? Shouldn't it be EAX?
  • The name displayTempArray clearly suggests processing the full array, yet you haven't written a loop that iterates over the array's elements. A work in progress no doubt?

最后还有那个孤立的proc calAverageLowHighTemps。它从无处调用,目前这还好,因为它在(重复两遍的)指令对 loop _cal... div ecx 中包含了可怕的除法异常。记住在 loop 完成后ECX=0。

你需要一步一步来。你已经有太多未经过测试的代码了!
第一步应该是成功地

  • 打印你的opening cartouche
  • 生成温度数组
  • 打印温度数组

一旦这真的能工作,你再添加一段额外的代码,然后再次运行。等它工作正常后再添加更多。祝你好运!

还有一个额外的错误我忘了提及:

; findDailyLows PUSH OFFSET low_daily PUSH temp_array CALL findDailyLows

看到了吗,这里你省略了 OFFSET 说明符?
该过程预计一个地址,但 push temp_array 只是传递了数组第一个元素的值。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章