Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вывод двойного слова в десятичном виде 
:(
    Опции темы
videns
Дата 11.5.2007, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 12.9.2006

Репутация: нет
Всего: нет



есть двойное слово, необходимо вывести его в десятичной форме. так как надо все делать в тасм, стандартый алгоритм делиния на 10 не получается, регистра еах нет ((
есть ли какой-либо алгоритм общий или готовый код? буду очень признателен.
PM MAIL   Вверх
Alexander77
Дата 11.5.2007, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 27.4.2007

Репутация: нет
Всего: нет



Есть:
Код

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

Это сообщение отредактировал(а) Alexander77 - 11.5.2007, 17:18
PM MAIL ICQ Skype YIM   Вверх
videns
Дата 12.5.2007, 07:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 12.9.2006

Репутация: нет
Всего: нет



регистров eax,ebx,ecx,edx нет, необходимо использовать только компилятор tasm. в этом-то и состоит основная проблема..
PM MAIL   Вверх
anwe
Дата 12.5.2007, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: 1
Всего: 23



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

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

Alexander77, просили в 10-й системе, а твой код выводит в 16-й. И где метка @B?
PM MAIL   Вверх
dumb
Дата 12.5.2007, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 4
Всего: 158



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

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

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

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

ps. экий я гаццкий критик. решений не даю, только критикую... smile
PM MAIL   Вверх
videns
Дата 12.5.2007, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 12.9.2006

Репутация: нет
Всего: нет



если работать с парой регистров DX:AX, то после деления на 10 частное может не поместиться в регистр. поэтому нужен какой-либо другой алгоритм для преобразования.  smile 
PM MAIL   Вверх
JAPH
Дата 12.5.2007, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 8.1.2007
Где: Ленобласть

Репутация: 1
Всего: 23



А в чём проблема? Делите сначала старшую часть, затем младшую.
Код
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     @



--------------------
Что непонятно - спрашиваем smile
PM MAIL ICQ   Вверх
anwe
Дата 12.5.2007, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: 1
Всего: 23



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

Это неявно. В коде ее не видно.
PM MAIL   Вверх
Mikl__
Дата 25.5.2007, 08:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 18.5.2007

Репутация: 1
Всего: 1



Скажешь своему преподу что сопроцессоры были уже в 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

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0737 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.