assembly 创建一个MASM程序,将温度从摄氏度转换为华氏度

7hiiyaii  于 2023-05-18  发布在  其他
关注(0)|答案(1)|浏览(179)

我在idiv dword ptr [NINE]行一直得到一个“整数溢出”。有没有其他方法可以重写它,让我的MASM正常运行,并在内存中给予我59°F的答案?

.386
.model flat, stdcall
.stack 4096
ExitProcess PROTO, dwExitCode:DWORD

.data
CelsiusTemperature DWORD 32

.code

; Function to convert Celsius to Fahrenheit
; Input: ecx - Celsius temperature
; Output: eax - Fahrenheit temperature
_convertC2F PROC
    push ebp                ; save the base pointer
    mov ebp, esp            ; set up the new base pointer
    sub esp, 4              ; reserve space for the return value
    mov eax, ecx            ; move the Celsius temperature to eax
    imul eax, 9             ; multiply by 9
    idiv dword ptr [NINE]   ; divide by 5
    add eax, 32             ; add 32 to get the Fahrenheit temperature
    mov dword ptr [ebp-4], eax ; store the Fahrenheit temperature on the stack
    mov eax, [ebp-4]        ; move the Fahrenheit temperature to eax
    mov esp, ebp            ; restore the stack pointer
    pop ebp                 ; restore the base pointer
    ret                     ; return from the function
_convertC2F ENDP

main PROC
    mov ecx, CelsiusTemperature ; set the Celsius temperature to the value in data
    call _convertC2F        ; call the function to convert to Fahrenheit
    ; eax now contains the Fahrenheit temperature
    ; do something with it here
    INVOKE ExitProcess, 0   ; exit the program
main ENDP

NINE DWORD 5

END main
ep6jt1vc

ep6jt1vc1#

NINE DWORD 5

将值5赋给名为 NINE(9)的变量是很奇怪的。
另外,为什么不把这个变量放在.data部分中,在那里已经有一个 CelsiusTemperature 变量?

mov eax, ecx            ; move the Celsius temperature to eax
imul eax, 9             ; multiply by 9
idiv dword ptr [NINE]   ; divide by 5
add eax, 32             ; add 32 to get the Fahrenheit temperature

您报告的错误之所以存在,是因为idiv dword ptr [NINE]指令划分了寄存器组合EDX:EAX,而您忘记了事先初始化EDX。

; Function to convert Celsius to Fahrenheit
; Input: ECX - Celsius temperature
; Output: EAX - Fahrenheit temperature
; Clobbers: EDX
_convertC2F PROC
    imul eax, ecx, 9      ; multiply Celsius by 9, store to EAX
    cdq                   ; sign-extend EAX into EDX:EAX
    idiv dword ptr [FIVE] ; signed division of EDX:EAX by 5
    add  eax, 32          ; add 32 to get Fahrenheit
    ret                   ; return from the function
_convertC2F ENDP

因为您使用寄存器参数(ECX)调用 _convertC2F 函数,并在EAX中返回结果,所以不需要在函数中包含那些序言/temp/尾声代码。

相关问题