2012-02-26 3 views
2

Последующие действия по предварительному вопросу. Я пытаюсь написать две процедуры в x86. Одна процедура считывает целое число (ReadInteger) в определенной базе, а затем записывает ее (WriteInteger) в другую базу. Где я боюсь, больше связано с решением, чем с реальным кодом.x86 Сборка Преобразование базовых номеров

Во-первых, ReadInteger может принимать число из любой базы (пример 1234, base 5). Тогда WriteInteger должен иметь возможность взять это целое число в eax и новое базовое значение в bl и преобразовать его в новую базу. Где я спрашиваю, мне нужно преобразовать все в процедуру ReadInteger или в другую процедуру в общую базу (скажем, десятичную), а затем преобразовать ее, поскольку я могу принимать только целое число и новые базовые значения в WriteInteger? Есть ли другой способ, который мне не хватает? Кажется, я не думаю о каком-либо другом способе этого делать, но задание читается так, как будто это должно быть проще.

Вот мой код.

;----------------------------------------------------- 
ReadInteger PROC 
; 
; ReadInteger is passed one argument in bl representing the base of the number to be input. 
; Receives: bl register (original base) 
; Returns: EAX 
;----------------------------------------------------- 
nextChar: 
    mov edx, 0    ; prepare for divide 
    mov base, ebx 
    call ReadChar   ; Get the next keypress 
    call WriteChar   ; repeat keypress 
    call AsciiToDigit  
    div base 
    shl ebx,1   ; shift to make room for new bit 
    or ebx,base   ; set the bit to eax 
    cmp al, 13    ; check for enter key 
    jne nextChar 
    mov eax, ebx   ; place integer value in eax for return 
    ret 
ReadInteger ENDP 

;----------------------------------------------------- 
WriteInteger PROC 
; 
; Will display a value in a specified base 
; Receives: EAX register (integer), bl (new base) 
; Returns: nothing 
;----------------------------------------------------- 

    mov ecx, 0   ; count the digits 
nextDigit: 
    mov edx, 0   ; prepare unsigned for divide 
    div ebx 
    push edx   ; remainder will be in dl 
    inc ecx   ; count it! 
    cmp eax, 0   ; done when eax becomes 0 
    jne nextDigit 

          ; pop them off and convert to ASCII for output 
outDigit: 
    pop eax    ; digits come off left to right 
    add eax, '0'   ; add 0 to get ASCII 
    call WriteChar   
    loop outDigit   

    call Crlf 
    ret 


ret 

WriteInteger ENDP

+2

Почему бы вам не понять, как это сделать на языке высокого уровня? Ассемблер x86 не является хорошим языком для прототипа математического алгоритма –

ответ

0

Число в регистрах не имеет определенную "базы", они просто двоичные числа. База - это то, что люди используют, чтобы сделать номера более читабельными. Это означает, что понятие «база» относится только к вводу и выводу, ничего не внутреннее для машины. (Есть странные исключения, такие как BCD, которые вы могли бы запустить в конце концов, но не сегодня.)

Итак, ваши функции, которые читаются с определенной базой и записываются с определенной базой, полностью независимы и единственной информацией, которая вам нужна между ними есть двоичное число.

+0

Вот что я думаю, что мне не хватает. Таким образом, значение сохраняется в двоичном виде в регистре, но мне все же нужно преобразовать его из символов ASCII в фактическое двоичное значение в функции ReadInteger? –

+0

Это правильно. –

Смежные вопросы