Том Свэн. Turbo Assembler

Тема в разделе "WASM.BEGINNERS", создана пользователем Nikankin, 20 фев 2008.

  1. Nikankin

    Nikankin New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2008
    Сообщения:
    16
    Здравствуйте.
    У Тома Свэна в книге Turbo Assembler, есть такая задача:
    Напишите программу распаковки любого количества битов из слова, возвращая эти биты, начиная с младшего разряда регистра. Иными словами, из вызывающей программы должны передаваться необходимые номера битов, например 4,5,6. Подпрограмма должна возвращать эти биты в позициях 0,1 и 2 устанавливая остальные биты в ноль.

    Т.е. я передаю биты 3,4,5 из числа, например 01101101, а мне нужно получить 00000101. В какую сторону рыть подскажите пожалуйста. на ум приходит rol и ror, чтобы все сдвинутое после полезного стало нулями, но ... как лучше это сделать
     
  2. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Nikankin
    Если я правильно понял требуется из 01101101 получить
    00000001
    00000100
    00001000
    00100000
    01000000
    Нечто подобное обсуждалось здесь, посмотри внимательно:)
    Код (Text):
    1.    cld
    2.        mov cl,8
    3.        mov bl,01101101b
    4.        mov al,1
    5.        mov di,offset Mass
    6. a1:  test al,bl
    7.        jz a2
    8.        stosb;mov [di],al/inc di
    9. a2:  shl al,1
    10.        loop a1
    11. Mass db 0,0,0,0,0,0,0,0
    q_q опечатка исправлена, спасибо
     
  3. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Mikl__
    stosb;mov [si],al/inc si
    imho di
     
  4. Nikankin

    Nikankin New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2008
    Сообщения:
    16
    Я немного исправил свой пост, ошибка была в результате.
    Дело в том, что предполагается вводить данные о битах хоть сколько раз. Т.е. программа должна обрабатывать любую комбинацию.
    Моя идея была такова.
    Берем биты, например с 3 по 5, т.е. из 01101101 будет 101. Байт 8 бит, позиции нужных битов известны из задания. Отнимаю от старшего бита 5 (7-5), получаю количество сдвигов для команды shl
    mov bh, 5
    mov bl, 3

    mov dl, 7 (длина байта)
    sub dl, bh
    mov cl, dl

    mov al, 01101101b
    mov cl, 2
    shl al (в результате получится: 10110100, искомые биты с 3 по 5 переместились в в старшие разряды)
    (теперь нужно отнять 7 - 3 и сдвинуть на указанное число вправо)

    mov dl, 7 (длина байта)
    sub dl, bl
    mov cl, dl

    mov cl, 4
    shr al (в результате 10110100 станет 00000101, что и требовалось)

    Не уверен в правильности алгоритма, хотя он мне таким кажется. Просто нет возможности сейчас проверить, ни одного компилятора под рукой, даже DEBUGа.
    Что скажете по это поводу?

    Mikl__ спасибо за ссылку
     
  5. Nikankin

    Nikankin New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2008
    Сообщения:
    16
    Код (Text):
    1. TITLE   ***
    2.     MODEL   TINY
    3.    
    4.  
    5. DATASEG
    6.     src db 01011010b
    7.     exCODE  DB 0
    8.  
    9. CODESEG
    10.  
    11.     ORG 100h
    12. START:
    13.     mov al, [src]
    14.     mov bh, 5                 ; Границы выбираемых битов
    15.     mov bl, 3
    16.    
    17.     mov     dl, 8                  ; Длина байта
    18.     sub dl, bh                 ; На сколько сдвигать
    19.     mov cl, dl
    20.     shl     al, cl
    21.    
    22.     mov dl, 8
    23.     sub dl, bl                  ; На сколько сдвигать
    24.     mov cl, dl
    25.     shr al, cl
    26.  
    27.  
    28. EXIT:
    29.     MOV AH, 4CH    
    30.     MOV AL, [exCODE]
    31.     INT 21H
    32. END START
    Этот код работает как нужно.

    А как передвинуть выбранные биты в начало байта (по младшим адресам), если биты расположены не по порядку? например из 01101001 выбрать биты 1,3,7 и получить 00000101

    Буду рад любым подсказкам.

    Ну и интересная же штука этот ассемблер :)