ВУЗы и колледжи

Написать программу для перевода введённого с клавиатуры шестнадцатеричного числа в десятичное на ассемблере (MASM).

> MASM
А для какой операционной системы?

Для Windows:

.386
.model flat, c
option casemap :none

includelib msvcrt.lib

printf proto :dword, :vararg
scanf proto :dword, :vararg
_getch proto
_exit proto :dword

.data
  Prompt db "Введите шестнадцатеричное число: ", 0
  InFrm db "%x", 0
  OutFrm db "Число в десятичной системе: %d", 13, 10, 10, \
    "Для завершения работы нажмите любую клавишу. . .", 0

.data?
  Number dd ?

.code
N172522903:
    invoke printf, addr Prompt
    invoke scanf, addr InFrm, addr Number
    invoke printf, addr OutFrm, Number
    invoke _getch
    invoke _exit, 0
    end N172522903

Для MS-DOS:

.model small
.stack 100h

.data
  Prompt db "Введите шестнадцатеричное число: $"
  Result db "Число в десятичной системе: $"
  WaitMsg db 13, 10, 10, "Для завершения работы нажмите любую клавишу. . .$"

.386
.code
WriteDec:
    push dx
    test eax, eax
    jns @F
    push eax
    mov al, 2Dh
    int 29h
    pop eax
    neg eax
@@:
    xor edx, edx
    mov ebx, 10
    div ebx
    or dl, 30h
    test eax, eax
    jz @F
    call WriteDec
@@:
    mov al, dl
    int 29h
    pop dx
    ret

ReadHex:
    xor ebx, ebx
    mov cx, bx
    mov edx, ebx
    mov esi, ebx
RepRead:
    mov ah, 8
    int 21h
    test al, al
    jnz @F
    int 21h
    jmp RepRead
@@:
    mov bl, al
    jcxz ReadSign
    cmp al, 0Dh
    jne @F
    cmp cx, 1
    jne ReadQuit
    test bh, bh
    jnz RepRead
    jmp ReadQuit
@@:
    cmp al, 8
    jne ReadDig
    cmp cx, 1
    jne @F
    xor esi, esi
    mov ebx, esi
@@:
    int 29h
    mov al, 20h
    int 29h
    mov al, 8
    int 29h
    shr edx, 4
    dec cx
    jmp RepRead
ReadSign:
    cmp al, 2Dh
    jne @F
    not esi
    jmp SetSign
@@:
    cmp al, 2Bh
    jne ReadDig
SetSign:
    mov bh, 1
    jmp ReadNext
ReadDig:
    sub al, 30h
    cmp al, 9
    jbe @F
    and al, 0DFh
    cmp al, 10h
    jbe RepRead
    sub al, 7
    cmp al, 10h
    jae RepRead
@@:
    test edx, 0F0000000h
    jnz RepRead
    shl edx, 4
    or dl, al
ReadNext:
    inc cx
    mov al, bl
    int 29h
    jmp RepRead
ReadQuit:
    mov al, 0Dh
    int 29h
    mov al, 0Ah
    int 29h
    mov eax, edx
    xor eax, esi
    sub eax, esi
    ret

N172522903:
    mov ax, @data
    mov ds, ax
    mov dx, offset Prompt
    mov ah, 9
    int 21h
    call ReadHex
    push eax
    mov ah, 9
    mov dx, offset Result
    int 21h
    pop eax
    call WriteDec
    mov ah, 9
    mov dx, offset WaitMsg
    int 21h

    mov ax, 0C08h
    int 21h
    mov ax, 4C00h
    int 21h
    end N172522903

Пример работы программы:
Омурзак Камбаров
Омурзак Камбаров
51 590
Лучший ответ