尝试编写一段代码,生成一个包含14天随机温度读数的数组。然后输出这14天的最高温、最低温以及平均温度
我正在尝试编写一个代码,用来生成一个包含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
generateTemperatureswith a single argument, yet you return from it usingret 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
loopinstruction. It is meant to use EBX instead (dec ebxjnz _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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。