Перевод числа в другую систему счисления - Assembler

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

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

Доброго времени суток, прошу помощи. Есть задача: написать программу, которая будет переводить десятичное число в другую систему счисления. В первом сниппете целое число a dw - больше 255 не будет работать. Решил написать, чтобы с большими числами тоже работало, но почему-то программа крашится, работает долго и ничего не выводит, если пробывать дебажить, то выводит "Program received signal SIGSEGV, Segmentation fault.". Программа успешно завершает работу, если закоментировать
mov word [rdx + 4 * rcx], dx
В чем ошибка? Прошу помочь и объяснить.
%include "io64.inc"
section .data
    mas times 100 dw 0
    a dw 10
    b db 2
    
section .text
global WinMain
WinMain: 
    mov rbp, rsp
    xor rcx, rcx
    mov rdx, mas
    
start_loop:
    mov ax, [a]
    idiv byte [b]
    
    mov [a], al
    
    inc rcx
    mov [rdx + 4 * rcx], ah
    
    test al, al
    jnz start_loop
 
CMP_:
    test rcx, rcx
    jnz PRINT
    jmp M_END
    
PRINT:
    mov rax, [mas + 4 * rcx]
    PRINT_DEC 4, rax
    dec rcx
    jmp CMP_
    
M_END:
    xor rax, rax
    ret
%include "io64.inc"
section .data
    mas times 100 dd 0
    a dd 10
    b dw 2
section .text
global WinMain
WinMain:
    mov rbp, rsp
    
    xor rcx, rcx
    mov rdx, mas
 
start_loop:
    mov ax, [a]
    mov dx, [a + 2]
    
    idiv word [b]
    
    mov word [a], ax
        
    inc rcx
    mov word [rdx + 4 * rcx], dx
        
    test ax, ax
    jnz start_loop
end_loop:
 
PRINT_ARRAY:    
 
CMP_:
    test rcx, rcx
    jnz PRINT
    jmp M_END
    
PRINT:
    mov rax, [mas + 4 * rcx]
    PRINT_DEC 4, rax
    dec rcx
    jmp CMP_    
    
M_END:
    xor rax, rax
    ret

Решение задачи: «Перевод числа в другую систему счисления»

textual
Листинг программы
%include "io64.inc"
 
section .data
    mas times 100 dd 0
    a dq 12345798
    b dd 2
    
section .text
global WinMain
WinMain:
    mov rbp, rsp
    xor rcx, rcx
 
start_loop:
    mov eax, [a]
    mov edx, [a + 4]
    
    idiv dword [b]
    
    mov dword [a], eax
    
    inc rcx
    mov dword [mas + 4 * rcx], edx
        
    test rax, rax
    jnz start_loop
end_loop:
 
PRINT_ARRAY:
CMP_:
    test rcx, rcx
    jnz PRINT
    jmp M_END
    
PRINT:
    mov rax, [mas + 4 * rcx]
    PRINT_DEC 4, rax
    dec rcx
    jmp CMP_    
    
M_END:
    xor rax, rax
    ret

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

Перевод числа в другую систему счисления:

  1. Объявляются переменные: — mas (массив 100 чисел), — a (исходное число), — b (коэффициент перевода).
  2. Запускается цикл перевода чисел: — Считается значение исходного числа (eax) и его старший байт (edx). — Выполняется деление eax на b с сохранением остатка в edx. — Результат записывается в a. — Увеличивается счётчик выполнения цикла (rcx). — Значение edx записывается в массив mas[rcx]. — Проверяется, что результат деления не равен нулю. Если это так, то продолжается цикл.
  3. После окончания цикла выполняется вывод массива на экран.

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

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