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


Автор: videns 11.5.2007, 15:10
есть двойное слово, необходимо вывести его в десятичной форме. так как надо все делать в тасм, стандартый алгоритм делиния на 10 не получается, регистра еах нет ((
есть ли какой-либо алгоритм общий или готовый код? буду очень признателен.

Автор: Alexander77 11.5.2007, 17:08
Есть:
Код

udw2a proc source:DWORD, lpBuffer:DWORD
;---------------------------------------
    push    eax
    push    esi
    mov     edx, lpBuffer
    mov     esi, source
    xor     eax, eax
    xor     ecx, ecx
    mov     [edx+8], al
    mov     cl, 7
@@:
    mov     eax, esi
    and     al, 00001111b
    cmp     al,10
    sbb     al,69h
    das
    mov     [edx + ecx], al
    shr     esi, 4
    dec     ecx
    jns     @B
    pop     esi
    pop     eax
    ret
;---------------------------------------
udw2a endp

И подобная тема: http://forum.progteam.ru/lofiversion/index.php/t396.html

Автор: videns 12.5.2007, 07:32
регистров eax,ebx,ecx,edx нет, необходимо использовать только компилятор tasm. в этом-то и состоит основная проблема..

Автор: anwe 12.5.2007, 10:33
videns, во-первых, можно поставить .386. Во-вторых, есть такая команда aam, посмотри ее. Ее действие сводится к делению регистра al на 0Ah (10), то есть основание системы счисления. Частное помещается в ah, остаток - в al.
К примеру
Код

mov   al,4
mov   bl,4
mul    bl   ;результат в ах=10h
aam   ;теперь = 0106h - неупакованное 16

Alexander77, просили в 10-й системе, а твой код выводит в 16-й. И где метка @B?

Автор: dumb 12.5.2007, 14:40
Цитата(anwe @  12.5.2007,  10:33 Найти цитируемый пост)
можно поставить .386

возможно имеется ввиду "неправильность" использования 32-битных регистров, чтоб научились работать с парой dx:ax.

Цитата(anwe @  12.5.2007,  10:33 Найти цитируемый пост)
И где метка @B

это одно из зарезервированных имен для ближайшей метки с именем '@@'. @B - back(назад по коду), @F - forward(вперед по коду).

ps. экий я гаццкий критик. решений не даю, только критикую... smile

Автор: videns 12.5.2007, 15:27
если работать с парой регистров DX:AX, то после деления на 10 частное может не поместиться в регистр. поэтому нужен какой-либо другой алгоритм для преобразования.  smile 

Автор: JAPH 12.5.2007, 17:35
А в чём проблема? Делите сначала старшую часть, затем младшую.
Код
cseg    segment
        assume  cs: cseg, ss: sseg
@:      mov     dx, 0123h
        mov     ax, 4567h
        mov     bx, 000Ah
        xor     cx, cx
@1:     mov     si, ax
        mov     ax, dx
        xor     dx, dx
        div     bx
        xchg    si, ax
        div     bx
        push    dx
        inc     cx
        mov     dx, si
        test    dx, dx
        jnz     @1
        test    ax, ax
        jnz     @1
        mov     ah, 02h
@2:     pop     dx
        add     dl, 30h
        int     21h
        loop    @2
        mov     ax, 4C00h
        int     21h
cseg    ends
sseg    segment stack
        db      0400h dup (?)
sseg    ends
        end     @

Автор: anwe 12.5.2007, 20:27
Цитата(dumb @  12.5.2007,  14:40 Найти цитируемый пост)
это одно из зарезервированных имен для ближайшей метки с именем '@@'. @B - back(назад по коду), @F - forward(вперед по коду).

Это неявно. В коде ее не видно.

Автор: Mikl__ 25.5.2007, 08:24
Скажешь своему преподу что сопроцессоры были уже в 8086, перевожу 64-битное в десятеричное число
Код

.287
.model tiny
.code
    ORG    100H
ccc1:    JMP    begin
;------------------------------------------------------
Data_Int64   dq ?;64-разрядное число
Data_BCD     dt ?;число в BCD-формате
mesbox_text db 25 dup(0)
begin:      mov di,offset mesbox_text
    fninit            ;сброс сопроцессора
    fild Data_Int64        ;загрузить число в двоичном коде
    fbstp Data_BCD        ;извлечь число в коде BCD
    mov si,9               ;в десятом байте информация о знаке числа
b2:           cmp byte ptr [si-1+Data_BCD],0
    jnz b3
                dec si
    jnz b2           ;пропускаем незначащие (нулевые) разряды слева
b3:    mov al,byte ptr [si-1+Data_BCD];загружаем первую значащую пару разрядов
                cmp al,9  ;если в старшей тетраде 0 - пропустить старшую тетраду
    ja b4
    add al,30h        ;младшую тетраду переводим в ASCII
    stosb
    dec si
b4:           xor ax,ax        ;распаковываем остальные разряды числа
    mov al,byte ptr [si-1+Data_BCD]
    shl ax,4         ;выделяем старшую и младшую тетрады
    shr al,4
    add ax,3030h        ;переводим в ASCII-код
    xchg ah,al
    stosw
                dec si
    jnz b4

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