2014-10-30 2 views
-8

Программа: введите целое число в базе 10 от 0 до 255 и измените число на базу n (где n - от 2 до 9).Программа ассемблера NASM

Я знаю, как конвертировать из базы 10 в 2. но не базу 10 на любую другую базу. Любые ссылки или примеры могут быть достаточными для начала работы.

+0

Это элементарная математика. Разделите базу в цикле и запишите остатки в обратном порядке. – Jester

ответ

1

Для того, чтобы обеспечить перевод на оригинальный ответ, и принимая во внимание о предоставлении человеку рыбу и кормить его в течение дня, следующего является NASM перевод. Примечание: это 32-битный код, как и в оригинале:

; build and link (32-bit on x86_64) 
; 
; nasm -f elf -o baseconvert_32.o baseconvert_32.asm 
; ld -m elf_i386 -o baseconvert_32 baseconvert_32.o 

section .data 

    base10 db 255 
    newbase db 7 
    result times 8 db 0 
    newline db 10 

section .text 
       global _start 

     _start: 
       mov  edi, result   ; offset in result string 

       xor  ax, ax    ; zero/clear ax register 
       mov  al, [base10]  ; at start, current remainder = whole value 
       mov  bl, [newbase] 

     loop: 
       div  bl     ; divide current remainder by new base 
       mov  [edi], ah 
       cmp  al, 0    ; is the quotient zero? 
       je  printchar   ; if it is we are done 
       xor  ah, ah 
       inc  edi     ; move offset in result string (note digits 
       jmp  loop    ; of answer are stored in reverse order) 

     printchar: 
       add byte [edi], 48  ; add ascii '0' to digit to get printable char 
       mov  eax, 4    ; linux sys_write 
       mov  ebx, 1    ; stdout 
       mov  ecx, edi   ; point to current digit 
       mov  edx, 1    ; number of chars to print 
       int  0x80    ; syscall 
       dec  edi     ; point to next digit 
       cmp  edi, result   ; are we past the final digit? 
       jge  printchar   ; if not, keep printing to stdout 

       ; print newline 
       mov  eax, 4 
       mov  ebx, 1 
       mov  ecx, newline 
       mov  edx, 1 
       int  0x80 

       xor  ebx, ebx   ; set zero exit code 
       mov  eax, 1    ; set syscall number to __NR_exit 1 (0x1 hex) 
       int  0x80    ; call kernel (syscall 32-bit) 

выход:

$ ./baseconvert_32 
513 
0

Ну, это не NASM, это газ, но следующий код работает для меня в Linux. Возможно, вы или какой-нибудь дружелюбный stackoverflower можете translate it into NASM.

Компиляция на Linux с gcc -nostdlib -g -o filename filename.s.

Вы можете изменить 255 и 7 на нужный дивиденд и базу.

Если вы не используете Linux/Unix, системные вызовы вряд ли сработают.

algorithm довольно прост.

.data 

base10: 
    .byte 255 
newbase: 
    .byte 7 
result: 
    .byte 0,0,0,0,0,0,0,0 # since dividend <=255 and divisor >=2 
          # 8 digits in the new base is enough 
newline: 
    .byte 10 

.text 

.global _start 
_start: 

    movl $result, %edi # offset in result string 

    xorw %ax, %ax 
    movb base10, %al # at start, current remainder = whole value 
    movb newbase, %bl 

loop: 
    divb %bl   # divide current remainder by new base 
    movb %ah, (%edi) 
    cmpb $0, %al  # is the quotient zero? 
    je printchar  # if it is we are done 
    xorb %ah, %ah 
    incl %edi   # move offset in result string (note 
    jmp loop   # digits of answer are stored in reverse 
         # order) 

printchar: 

    addl $48, (%edi) # add ascii '0' to digit to get printable char 
    movl $4, %eax  # linux sys_write 
    movl $1, %ebx  # stdout 
    movl %edi, %ecx  # point to current digit 
    movl $1, %edx  # one char to print 
    int $0x80   # syscall 
    decl %edi   # point to next digit 
    cmpl $result, %edi # are we past the final digit? 
    jge printchar  # if we aren't keep going 

    # print a newline 
    movl $4, %eax  
    movl $1, %ebx 
    movl $newline, %ecx 
    movl $1, %edx 
    int $0x80 

    # finish nicely 
    movl $0, %ebx 
    movl $1, %eax 
    int $0x80 
+0

Да, давая полный рабочий код OP, он научит его чему угодно. –

+0

@JonathonReinhart: SO - это образовательный сайт? – rkhb

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