Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.11.2008, 01:36   #1
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
Вопрос Hex2Bin без использования сегментных регистров(MASM32v9)

Столкнулся с вполне ожидаемой проблемой - не могу использовать сегментные регистры, а потребность есть. Команды lodsb stosb и иже с ними, естественно приводят к C0000005. Интересует возможная реализация через память. Если не лень набросайте пожалуйста приблизительный алгоритм. Заранее благодарен.
PS: Как тут на форуме ставить эквивалент "Спасибо" - повышать репутацию?
PSS: Алгоритм самого перевода тоже очень интересует.
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Старый 24.11.2008, 10:55   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Как тут на форуме ставить эквивалент "Спасибо" - повышать репутацию?
под ником того, кому хотите повысить/понизить репутацию есть значок "весы" - "Добавить отзыв для ...."
вот через эту кнопочку.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 24.11.2008, 16:21   #3
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от Ivan_32 Посмотреть сообщение
Столкнулся с вполне ожидаемой проблемой - не могу использовать сегментные регистры, а потребность есть.
если ты пишешь 32 битное приложение под Windows у тебя ничего не получится. Забудь про это!!!
rpy3uH вне форума Ответить с цитированием
Старый 24.11.2008, 19:09   #4
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

А пакетные функции MASM-а, есть ведь какое то семейство функций для работы с блоками данных/строками?
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Старый 02.12.2008, 11:33   #5
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию STR2DWORD, DWORD2STR

если тебя интерисует преобразование Hex2Bin, то алгоритм такой. Есть строка "01E3F5Bh" тебе надо её преобразовать в число, потом полченное число преобразовать с строку с указанием системы счисления.

данная функция конвертирует число в строку, принимает беззнаковое число в виде строки в любой системе счисления, если происходит какая-либо ошибка, то результат 0
Код:
STR_to_DWORD:
; IN  ESI = указатель на ZS строку
;     EAX = разрядность
; OUT EAX = результат
    push esi
    push ebx
    push edi
    push edx
    push ecx

    cmp eax, 16
    ja .error
    cmp eax, 2
    jb .error

    mov ecx, eax

    mov edi, esi
    call GetZSLength
    mov edi, eax
    add edi, esi  ; edi point to end ZS

    xor eax, eax
    xor edx, edx
    inc edx

   .rep:
    dec edi

    xor ebx, ebx
    mov bl, [edi]
    cmp bl, 30h
    jb .error
    cmp bl, 39h
    jna .digit
    cmp bl, 41h
    jb .error
   @@:
    cmp bl, 46h
    jna .sim_upcase
    cmp bl, 61h
    jb .error
   @@:
    cmp bl, 66h
    jna .sim_lowcase
    ja .error

   .digit:
    sub bl, 30h
    jmp @f
   .sim_upcase:
    sub bl, 37h
    jmp @f
   .sim_lowcase:
    sub bl, 57h
   @@:
    cmp bl, cl
    ja .error

    imul ebx, edx
    add eax, ebx
    imul edx, ecx
    cmp edi, esi
    jnz .rep
   .endrep:


    jmp @f
   .error:
    xor eax, eax
   @@:

    pop ecx
    pop edx
    pop edi
    pop ebx
    pop esi
    ret
следующая функция, тоже конвертирует сроку в число, использует вышеприведённый алгоритм, вот только она принимает только строку, разрядность определяет сама по символу в конце строки (если h то шестнадцатеричное, если o то восьмеричное, если b, то двоичное, иначе десятеричное, если число нпаример в двенадцатеричной системе, а в конце стоит буква b, то ошибку распознает вышеуказанная функция и результат всё равно будет 0), так же функция определяет знак числа
Код:
STR_to_DWORD_EX:
; IN  ESI = pointer to ZS
; OUT EAX = result
    push esi
    push ebx
    push edi

    xor ebx, ebx
    cmp byte [esi], '-'
    jnz .sign_plus
    mov ebx, 1
    inc esi
   .sign_plus:

    mov edi, esi
    call GetZSLength
    mov edi, eax
    add edi, esi
    dec edi
    cmp byte [edi], "b"
    jnz .oct
    mov eax, 2
    xchg byte [edi], bh
    jmp .convert
   .oct:
    cmp byte [edi], "o"
    jnz .hex
    mov eax, 8
    xchg byte [edi], bh
    jmp .convert
   .hex:
    cmp byte [edi], "h"
    jnz .decim
    mov eax, 16
    xchg byte [edi], bh
    jmp .convert
   .decim:
    mov eax, 10
    mov bh, byte [edi]
   .convert:
    call STR_to_DWORD
    xchg byte [edi], bh
    xor bh, bh
    cmp ebx, 1
    jnz .end
    xor ebx, ebx
    sub ebx, eax
    mov eax, ebx
   .end:
    pop edi
    pop ebx
    pop esi
    ret

Преобразование числа в строку. В любую систему счисления. он может выводить и отрицательное число (если оно больше чем 7FFFFFFFh)
Код:
dword_to_STR:
;на входе EAX число 32 бит
;         ESI указатель на строку
;         EBX разрядность результата
      pushad
      cmp ebx, 16
      ja  .end
      cmp eax, 7FFFFFFFh
      jna .sign_plus
      mov byte [esi], '-'
      inc esi
      not eax
      inc eax
     .sign_plus:
      xor ecx, ecx
      jmp .repeat

.mesto db 32 dup (0)

    .repeat:
      xor edx, edx
      div ebx
      mov edi, eax
      mov al, dl
      cmp al, 10
      sbb al, 69h
      das
      mov byte [.mesto+ecx], al
      mov eax, edi

      inc ecx
      cmp eax, 0
      jz .endrep
      jmp .repeat
    .endrep:
      mov edi, .mesto
      add edi, ecx
    .copyrep:
      dec edi
      mov dl, byte [edi]
      mov byte [esi], dl
      inc esi

      loop .copyrep
    .end:
      popad
      ret
P.S. всё для FASM

Последний раз редактировалось rpy3uH; 02.12.2008 в 11:39.
rpy3uH вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Групироваие данных по месяцем в кварталы без использования сводных таблиц McKlavishnikov Microsoft Office Excel 17 12.02.2009 14:11
вывод текста без использования библиотек? ddos Общие вопросы C/C++ 0 08.11.2008 21:47
Masm32v9 не устанавливается JTG Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 30.07.2008 22:30
много регистров nntpaha Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 22.12.2007 19:01
Рисование фигур в Delphi7 без использования VCL saintninja Помощь студентам 15 20.10.2007 11:04