Преобразование Фаренгейта в Цельсий с помощью ассемблера MASM - PullRequest
0 голосов
/ 22 октября 2018

Я учусь кодировать низкоуровневый язык, и я пытаюсь написать программу, которая получит степень Фаренгейта от пользователя, а затем преобразует ее в градусы Цельсия с помощью этой операции

( 5/9 ) * (input- 32) 

Чтобы получитьрезультат я сначала вычисляю

5*(input - 32) 

, который оставляет продукт в ax, а затем делит на 9, но затем я получаю неправильный результат.
Спасибо за помощь.

include PCMAC.INC
.model small
.586
.stack 100h
.data
  msg        db 'Enter  the degree in fahrenheit:  $'
  input      dw ?
  cel        dw ?
  outputmsg  db " Conversion done, result is $"
  outputmsg2 db " celsius", 13, 10, '$'
  A          dw 5   
  B          dw 9   
.code
  extrn GetDec:near, PutDec:near
  main      PROC
    _Begin 
    _Putstr msg          
    call GetDec     

    mov input, ax   

    mov bl, 32
    sub al, bl
    ; sub ax, 32

    mov cx, A
    imul cx

    mov cx, B
    idiv cx

    mov cel, ax

    _putstr outputmsg
    call PutDec

    _putstr outputmsg2
    _Exit 0
  main endp
end  main

Я только что отредактировал код, теперь я получаю правильные ответы, когда Цельсий положительный, но когда мой ответ (Цельсий) отрицательный, результат неверный. Я не уверен, как получить отрицательный градус Цельсия

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

Я понял, почему я не смог получить отрицательный результат (степень).Раньше размер моего регистра был слишком мал, чтобы содержать биты для отрицательных чисел, поэтому для исправления я использовал регистры EAX, чтобы увеличить пространство.

включает PCMAC.INC

.модель малый .586 .стек 100h .данные

msg db 'Введите градусы в градусах Фаренгейта: $'

inputdw?

cel dw?

outputmsg db "Преобразование выполнено, результат - $"

outputmsg2 дБ "Цельсия", 13, 10, '$'

A dw 5

B dw 9

.code

extRN GetDec: рядом, PutDec: рядом с основным PROC

_Begin 

_Putstr msg          


call GetDec     

mov input, ax   

mov ebx, 32
sub eax, ebx
;mov bl, 32
;sub al, bl
; sub ax, 32

mov cx, A
imul cx
;mov cx, A
;imul cx


mov cx, B
idiv cx
;mov cx, B
;idiv cx


mov dx, 0
mov cx, ax
;mov cel, ax

_putstr outputmsg
mov eax, ecx
call PutDec
0 голосов
/ 22 октября 2018
Mov cx, [B]
Imul cx
Mov cx, [A]
Idiv cx

Если вы сомневаетесь в чем-то подобном, снова разберите ваш код.Я отчетливо помню, что imul и idiv не нравятся незарегистрированные аргументы при использовании masm

Кроме того, всегда ставить?после не?значения dw.В противном случае безумные невозможные ошибки.

...