Конвертация температуры из Fahrenheit в Celsius и обратно - Assembler/TASM

Узнай цену своей работы

Формулировка задачи:

Когда делаю компиляцию говорит, что есть одна ошибка. Можете помочь найти эту ошибку? Вот код :
DATA SEGMENT
T    DB ?
RES  DB 10 DUP ('$')
MSG1 DB "ENTER TEMPERATURE in CELCIUS OR IN FAHRENHEIT (ONLY IN 2 DIGITS) : $"
MSG2 DB 10,13,"CHOOSE F OR C : $"
MSG3 DB 10,13,"CONVERTED IS (TEMPERATURE) : $"
DATA ENDS
 
CODE SEGMENT
ASSUME DS: DATA,CS: CODE
START:
MOV AX,DATA
MOV DS,AX
 
LEA DX,MSG1
MOV AH,9    
INT 21H
 
MOV AH,1    
INT 21H
SUB AL,30H   
MOV AH,0    
MOV BL,10    
MUL BL      ; AL*10  BX*AX   В AX РЕЗУЛЬТАТ 
MOV BL,AL   ; РЕЗУЛЬТАТ В BL
MOV AH,1     
INT 21H
SUB AL,30H      
MOV AH,0
ADD AL,BL
 
LEA DX,MSG2
MOV AH,9    ; MESAJ2: CHOOSE F OR C:
INT 21H
 
MOV AH,1     
INT 21H
 
CMP AL,F
JE  FAHRENHEIT  
CMP AL,C
JE CELSIUS
 
FAHRENHEINT:
 
MOV T,AL     ; В  AX  ЕСТЬ  TEMPERATURA IN CELCIUS 
 
MOV DL,9     ; F=(C*9/5)+32  
MUL DL       ; DL*AX    В  AX  TEMPERATURA IN CELSIUS REZULTA (C*9) 
MOV BL,5     
DIV BL       ;   (C*9/5)
MOV AH,0     
ADD AL,32    ; F=(C*9/5)+32
 
LEA SI,RES     
CALL HEX2DEC 
 
LEA DX,MSG3  ; CONVERTED FAHRENHEIT TEMPERATURE
MOV AH,9          
INT 21H
 
LEA DX,RES
MOV AH,9     ; РЕЗУЛЬТАТ
INT 21H
 
MOV AH,4CH
INT 21H        
CODE ENDS
 
CELSIUS:
MOV T,AL     ; В  AX ЕСТЬ    TEMPERATURA  IN FAHRENHEIT
MOV AH,0
ADD AL,32
MOV DL,5
MUL DL
MOV BL,9
DIV BL         ; C =((F+32)*5)/9 
 
LEA SI,RES     
CALL HEX2DEC 
 
LEA DX,MSG3  
MOV AH,9         
INT 21H
 
LEA DX,RES
MOV AH,9     ; REZULTATUL CONVERTIRI
INT 21H

MOV AH,4CH
INT 21H       
CODE ENDS
 
HEX2DEC PROC NEAR
MOV CX,0              
MOV BX,10
 
LOOP1: MOV DX,0
DIV BX
ADD DL,30H
 
PUSH DX
INC CX  ; CX=CX+1;
 
CMP AX,9
JG LOOP1   ; IF AX>9 LOOP1
 
ADD AL,30H
MOV [SI],AL  ;  RES IN AL 
 
LOOP2: POP AX
INC SI     ; SI=SI+1
 
MOV [SI],AL
LOOP LOOP2
RET
 
HEX2DEC ENDP
END START

Решение задачи: «Конвертация температуры из Fahrenheit в Celsius и обратно»

textual
Листинг программы
DATA SEGMENT
T    DB ?
RES  DB 10 DUP ('$')
MSG1 DB       "ENTER TEMPERATURE in CELCIUS OR IN FAHRENHEIT (ONLY IN 2 DIGITS) : $"
MSG2 DB 10,13,"CHOOSE F OR C : $"
MSG3 DB 10,13,"CONVERTED IS (TEMPERATURE) : $"
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START:
MOV AX,DATA
MOV DS,AX
LEA DX,MSG1
MOV AH,9    ;MESAJ1:ENTER TEMPERATURE (ONLY IN 2 DIGITS)
INT 21H
MOV AH,1    ;читаем из клавиатуры  
INT 21H
SUB AL,30H  ; вводимые числа в ASCII надо делать вычитание из 30h(0) чтобы возвращать начальное значение вводимого 
                    ; числа  например   5 мы видим это так   35H  и когда вычитаем  30H  получим  5  
MOV AH,0    ; очищаем регистр AH   
MOV BL,10    
MUL BL        ; AL*10  BX*AX   в  AX будет результат 
MOV BL,AL   ; результат в  BL
MOV AH,1    ; читаем из клавиатуры  
INT 21H
SUB AL,30H  ; возвращаем в начальное значения       
MOV AH,0
ADD AL,BL
LEA DX,MSG2
MOV AH,9    ; MESAJ2:CHOOSE F OR C:
INT 21H
MOV AH,1    ; читаем из клавиатуры   
INT 21H
CMP AL,'F'
JE  FAHRENHEIT  ; IF F  go to fahrenheit 
CMP AL,'C'          
JE CELSIUS         ; IF С  go to  CELSIUS 
FAHRENHEIT:
MOV T,AL     ; в  AX  у нас температура в CELSIUS 
MOV DL,9     ; F=(C*9/5)+32  
MUL DL         ;  DL*AX  в AX у нас температура в CELSIUS  (C*9) 
MOV BL,5      ; в  BL есть   5
DIV BL          ;  ax(c*9)/bl
MOV AH,0     ;     (C*9)/5) 
ADD AL,32           ; + 32  
LEA SI,RES          ;  для инициализации res в si  
CALL HEX2DEC    ;вызываем HEX2DEC
LEA DX,MSG3  ;CONVERTED FAHRENHEIT TEMPERATURE
MOV AH,9     ; display result     
INT 21H
LEA DX,RES
MOV AH,9     ;display RES 
INT 21H
MOV AH,4CH
INT 21H        
CELSIUS:
MOV T,AL     ;в  AX  у нас температура в FAHRENHEIT
MOV AH,0
ADD AL,32
MOV DL,5
MUL DL
MOV BL,9
DIV BL          ;C=((F+32)*5)/9 
LEA SI,RES   
CALL HEX2DEC 
LEA DX,MSG3  
MOV AH,9          
INT 21H
LEA DX,RES
MOV AH,9     ;RESULT
INT 21H
MOV AH,4CH
INT 21H          
HEX2DEC PROC NEAR
MOV CX,0              
MOV BX,10
LOOP1: 
MOV DX,0
DIV BX
ADD DL,30H
PUSH DX
INC CX  ;CX=CX+1;
CMP AX,9
JG LOOP1   ;IF AX>9 LOOP1
ADD AL,30H
MOV [SI],AL  ;VARIABILA RES IN AL 
LOOP2: 
POP AX
INC SI     ;SI=SI+1
MOV [SI],AL
LOOP LOOP2
RET
HEX2DEC ENDP
END START
 
CODE ENDS

Объяснение кода листинга программы

  1. Ввод температуры в градусах Цельсия или Фаренгейта с клавиатуры.
  2. Преобразование введенного числа из ASCII в десятичное число.
  3. Преобразование температуры из градусов Цельсия в градусы Фаренгейта (для этого используется формула F=(C*9/5)+32).
  4. Преобразование температуры из градусов Фаренгейта в градусы Цельсия (для этого используется формула C=((F+32)*5)/9).
  5. Вывод результата на экран.
  6. Завершение работы программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4 из 5
Похожие ответы