Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > ASM,DOS,четверичная система счисления


Автор: crazysun 5.10.2005, 16:43
блин препод садист дал задание перевести из 4 системы в 16 + число в четверичной системе должно быть не более 4 разрядным...
Как всегда здавать завтра надеялся на свои силы, но они подвели ...

P.S. потом только заметил название темы не asm, а Tasm...

Автор: Mayk 5.10.2005, 16:55
сча опишу алгоритм как прочитать n-ичную систему счисления.

пусть у нас есть число - строка из цифр 4-ой сс

инициализация
ПУСТЬ результат = 0

основной цикл
ДЛЯ каждой цифры числа (слева направо)
результат = (результат * база) + цифра

Теперь в результате у нас есть число. Вот его и выводим.

(пример.
пусть у нас есть 21 (2*4+1=9) в четверичной системе.

0) результат = 0 //инициализация
1) результат = 0 * 4 + 2 = 2 // основной цикл
2) результат = 2*4 + 1 = 9 // основной цикл

9 = 9
Добавлено @ 16:55
сча поищу как этот алгоритм называется.

Добавлено @ 17:00
Чйорт. Непонятно написано.

Автор: crazysun 5.10.2005, 17:10
ничего не понемаю ... smile и кстати забыл добавить у меня XP ...
я еще asm плохо знаю, есть две книги Абеля и Зубкова ... читаю учу ...


Автор: Mayk 5.10.2005, 17:25
Это алгоритм такой занятный (не знаю как называется - неясно написал) по переводу строки в число.
На пасе выглядит примерно так
Код

for i:= 1 to length(str) do
 res := res * 4 + str[i]-'0';


Цитата(crazysun @ 5.10.2005, 21:10)
я еще asm плохо знаю, есть две книги Абеля и Зубкова ... читаю учу ...

Зубков рулит.
В описании команды DAS (стр. 39, если у нас одинаковые книг - "Асм для DOS, WIN, UNX", изд. "Питер", 2005 год)
даётся код по распечатке 16-ых цифр.

Автор: crazysun 5.10.2005, 17:35
Цитата
описании команды DAS (стр. 39, если у нас одинаковые книг - "Асм для DOS, WIN, UNX", изд. "Питер", 2005 год)
даётся код по распечатке 16-ых цифр.

видел, там вообще пример dosin1 идеальный для перевода из 10 системы в 16 ...
Там можно и зделать что бы число было четырех разрядным вот тока система 10 ...
Кто еще не видел вот код ...
Мне бы его умный человек поправил бы smile
Код

; dosin1.asm
; Переводит десятичное число в шестнадцатеричное
;
; Компиляция:
; TASM:
; tasm /m dosin1.asm
; tlink /t /x dosin1.obj
; MASM:
; ml /c dosin1.asm
; link dosin1.obj,,NUL,,,
; exe2bin dosin1.exe dosin1.com
; WASM
; wasm dosin1.asm
; wlink file dosin1.obj form DOS COM
;

    .model    tiny
    .code
    .286        ; для команды shr al,4
    org    100h    ; начало COM-файла
start:
    mov    dx,offset message1
    mov    ah,9
    int    21h        ; вывести приглашение к вводу message1
    mov    dx,offset buffer
    mov    ah,0Ah
    int    21h        ; считать строку символов в буфер
    mov    dx,offset crlf
    mov    ah,9
    int    21h        ; перевод строки

; перевод числа в ASCII-формате из буфера в бинарное число в AX
    xor    di,di        ; DI = 0 - номер байта в буфере
    xor    ax,ax        ; AX = 0 - текущее значение результата
    mov    cl,blength
    xor    ch,ch
    xor    bx,bx
    mov    si,cx        ; SI - длина буфера
    mov    cl,10        ; CL = 10, множитель для MUL
asc2hex:
    mov    bl,byte ptr bcontents[di]
    sub    bl,'0'    ; цифра = код цифры - код символа "0"
    jb    asc_error    ; если код символа был меньше, чем код "0",
    cmp    bl,9        ; или больше, чем "9",
    ja    asc_error    ; выйти из программы с сообщением об ошибке,
    mul    cx        ; иначе: умножить текущий результат на 10,
    add    ax,bx        ; добавить к нему новую цифру,
    inc    di        ; увеличить счетчик
    cmp    di,si        ; если счетчик+1 меньше числа символов -
    jb    asc2hex    ; продолжить
; (счетчик считается от 0)

; вывод на экран строки message2
    push    ax        ; сохранить результат преобразования
    mov    ah,9
    mov    dx,offset message2
    int    21h
    pop    ax

; вывод на экран числа из регистра AX
    push    ax
    xchg    ah,al        ; поместить в AL старший байт
    call    print_al    ; вывести его на экран
    pop    ax        ; восстановить в AL младший байт
    call    print_al    ; вывести его на экран

    ret        ; завершение COM-файла

asc_error:
    mov    dx,offset err_msg
    mov    ah,9
    int    21h        ; вывести сообщение об ошибке
    ret            ; и завершить программу


; Процедура print_al.
; выводит на экран число в регистре AL в шестнадцатеричном формате
; модифицирует значения регистров AX и DX


print_al:
    mov    dh,al
    and    dh,0Fh        ; DH - младшие 4 бита
    shr    al,4        ; AL - старшие
    call    print_nibble    ; вывести старшую цифру
    mov    al,dh        ; теперь AL содержит младшие 4 бита
print_nibble:        ; процедура вывода 4 бит (шестнадцатеричной цифры)
    cmp    al,10        ; три команды, переводящие цифру в AL
    sbb    al,69h        ; в соответствующий ASCII-код
    das            ; (см. описание команды DAS)

    mov    dl,al        ; код символа в DL
    mov    ah,02h        ; номер функции DOS в AH
    int    21h        ; вывод символа
    ret        ; этот RET работает два раза - один раз для возврата из
; процедуры print_nibble, вызванной для старшей цифры,
; и второй раз - для возврата из print_al

message1 db    'Enter decimal number: $'
message2 db    'Hex number is: $'
err_msg    db    'Bad number entered'
crlf    db    0Dh,0Ah,'$'
buffer    db    10        ; максимальный размер буфера ввода
blength    db    ?        ; размер буфера после считывания
bcontents:            ; содержимое буфера располагается за
                ; концом COM-файла
end    start


Автор: Akina 5.10.2005, 23:28
Мама моя! как все запущено...

Код

; DS:SI - источник, строка 4-значного числа в 4-ричной системе счисления
; ES:DI - приемник, строка для размещения 2-значного того же числа в 16-ричной системе

Convert proc
 cld
 mov cx,2
repeat:
 lodsw
 sub ax,'00'
 shl al,4
 add al,ah
 add al,'0'
 cmp al,'9'
 jna store
 add al,'A'-'9'-1
store:
 stosb
 rep repeat
 ret
Convert endp

PS. Написано на лету - требует проверки.

Автор: sOckets 14.9.2006, 22:21
Akina
Сообщений: 5555

Ну не мог я не написать ! smile

Добавлено @ 22:22 
только что заметил дату  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)