Другие языки программирования и технологии

я должен написать прогу на ассемблере для перевода числа из восьмеричной системы в десятичную

какие нить идеи как это делать?
пока умею hexa to dec,hexa to binary,hexa to octal
Идея такая: вводить числа в восьмеричной системе, а выводить в десятичной.

Если писать для Windows или Linux, то это очень просто. Особенно, если не проверять корректность ввода.

Windows:

from msvcrt.dll
  import printf
  import scanf_s
  import _getch
  import _exit

section "code" class_code
section "data" class_data
section "idata" class_imports

.data
  Prompt db "Введите число в восьмеричной системе: ", 10, 0
  Result db "Число в десятичной системе: ", 10, "%d", 10, 10
      db "Для завершения работы нажмите любую клавишу... ", 0
  Format db "%o", 0
  X rd 1

.code
  .entry N169555874

N169555874:
    cinvoke printf, Prompt
    cinvoke scanf_s, Format, X
    cinvoke printf, Result, [X]
    invoke _getch
    cinvoke _exit, 0

Linux:

extern printf
extern scanf
extern exit

section .data
  Prompt db "Введите число в восьмеричной системе: ", 10, 0
  Result db "Число в десятичной системе: ", 10, "%d", 10, 0
  Format db "%o", 0

section .bss
  X resd 1

section .text
global main
main:
    push Prompt
    call printf
    push X
    push Format
    call scanf
    push dword [X]
    push Result
    call printf
    add esp, 20
    call exit

Для MS DOS немного сложнее:

format MZ
entry code:N169555874

segment code
N169555874:
    mov cx, data_seg
    mov ds, cx
    mov dx, Prompt
    mov ah, 9
    int 21h
    call ReadOct
    push eax
    mov ah, 9
    mov dx, Result
    int 21h
    pop eax
    call WriteDec
    mov ah, 9
    mov dx, WaitMsg
    int 21h
    mov ax, 0C08h
    int 21h
    mov ax, 4C00h
    int 21h

ReadOct:
    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, 3
    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, 8
    jae RepRead
    test edx, 0F0000000h
    jnz RepRead
    shl edx, 3
    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

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

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



Разбирайтесь.
SI
Sobir I Mahsuma Khasanovi
51 590
Лучший ответ
http://meatspean.rf/?hax/forum/assembler
Посмотри, тут вроде неплохие исходники попадаются.

Похожие вопросы