es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Dividir un número negativo en ensamblador.

Quiero crear un programa que pueda convertir grados Fahrenheit a Celsius. El problema es que mi programa produce números locos cuando los grados Celsius son negativos, a pesar de que intenté usar las instrucciones idiv y div pero no funcionan. ¿Alguien tiene ideas sobre cómo solucionar esto?

Aquí está mi código de ensamblador:
“`
.386
.MODEL FLAT

ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD

include io.h ; archivo de encabezado para entrada/salida

cr equ 0dh ; carácter de retorno de carro
Lf equ 0ah ; avance de línea

.STACK 4096 ; reservar una pila de 4096 bytes

.DATA ; reservar espacio de almacenamiento para datos
enterdegree byte “Ingrese la temperatura en Fahrenheit:”,0
degree qword ?

result byte “la temperatura en Celsius es: ”
celi byte 40 dup(?)

.CODE ; inicio del código del programa principal
_start:
; ingresar grados en Fahrenheit
output enterdegree
input degree ,8
atod degree
;(f-32)
sub eax,32

    ;(f-32)*5
    mov    edx,0
    mov    ebx,5
    imul   eax,ebx

    ;(f-32)*5/9
    mov    edx,0
    mov    ebx,9
    idiv    ebx

    dtoa   celi,eax

    output result


    INVOKE ExitProcess, 0   ; salir con el código de retorno 0

PUBLIC _start ; hacer el punto de entrada público
END ; fin del código fuente

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema con el programa que produce números locos cuando el grado Celsius es negativo probablemente se debe al uso de la instrucción “idiv”, que realiza una división con signo. Para solucionar este problema, puedes usar la instrucción “div” en su lugar, que realiza una división sin signo.

    Aquí está el código modificado con la instrucción “div”:

    .386
    .MODEL FLAT
    
    ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD
    
    include io.h            ; archivo de cabecera para entrada/salida
    
    cr      equ     0dh     ; carácter retorno de carro
    Lf      equ     0ah     ; alimentación de línea
    
    .STACK  4096             ; reserva una pila de 4096 bytes
    
    .DATA                   ; reserva espacio para los datos
    enterdegree   byte    "Ingrese la temperatura en Fahrenheit:",0
    degree        qword      ?
    
    result        byte    "La temperatura en Celsius es: "
    celi           byte    40 dup(?)
    
    
    .CODE                           ; inicio del código principal del programa
    _start:
                ; ingresar la temperatura en Fahrenheit
                output enterdegree
                input  degree ,8
                atod   degree
                ;(f-32)
                sub    eax,32
    
                ;(f-32)*5
                mov    edx,0
                mov    ebx,5
                imul   eax,ebx
    
                ;(f-32)*5/9
                mov    edx,0
                mov    ebx,9
                div    ebx      ; división sin signo
    
                dtoa   celi,eax
    
                output result
    
    
                INVOKE ExitProcess, 0   ; salir con código de retorno 0
    
    PUBLIC _start                       ; hacer que el punto de entrada sea público
    END                                 ; fin del código fuente
    
    

    Con esta modificación, el programa debería mostrar resultados correctos tanto para grados Celsius positivos como negativos.

Comments are closed.