помогите дописать...

Тема в разделе "WASM.ASSEMBLER", создана пользователем compbooks_ru, 5 окт 2009.

  1. compbooks_ru

    compbooks_ru New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2009
    Сообщения:
    7
    вообщем нужно сделать это:
    1. Поменять местами 0-2 разряды младшего и старшего байтов в слова А
    2. Сложить С и D в двоичном виде
    3. Выделить старший байт А и младший байт В и сложить их как два двоично-десятичных числа
    4. Разделить А на D и остаток от деления объединить по "исключающему ИЛИ" с результатом п.3

    я сделал первые 2 пункта:


    Код (Text):
    1. .model tiny
    2. .data
    3.       a equ 2438h
    4.       b equ 1329h
    5.       c dw -157
    6.       d dw 100
    7. .code
    8.     .startup
    9. ;1
    10.     mov ax,a
    11.     and ax,0007h
    12.     mov bx,a
    13.     and bx,0700h
    14.     mov cl,8
    15.     shl ax,cl
    16.     shr bx,cl
    17.     or ax,bx
    18.  
    19. ;2
    20. mov cx,c
    21. mov dx,d
    22. or cx,dx
    23. das
    24.  
    25.     .exit
    26. end
    проверьте пожалуйста первые 2 пункта и помогите дописать 3 и 4)
     
  2. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Ну ты крут! Даже для Beginners эти вопросы слишком тривиальны.
    3) Аналогичен и проще пункта 1, т.к. старший байт - это AH, а младший - BL
    4) Сложно разжевать - начинающим рекомендуется читать что-нибудь по ассемблеру, там это есть.
    Про деление. XOR - это азбука.
     
  3. Microedition

    Microedition Active Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    814
    Не азбука, о операция побитового Исключающего ИЛИ.
    А причем тут XOR?
     
  4. compbooks_ru

    compbooks_ru New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2009
    Сообщения:
    7
    ;3
    mov AX,A
    mov BX,B
    add AH,BL
    daa

    ;4
    mov ax,a
    mov dx,d
    div a
    xor dx,ah

    правильно написал 3 и 4 пункт? по поводу остатка: после деления остаток помещается в dx, а частное в ax?
     
  5. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    В 3-м add - это бинарное сложение. А нужно сложение в BCD. Я не помню, есть оно у Интела?
    В 4-м пункте ошибка. XOR делается не с DX, а с результатом из 3го алгоритма.
    Т.е. опять повторяем все, что в 3-м, сохраняем результат, например в bl, и потом ксорим именно с ним.
     
  6. compbooks_ru

    compbooks_ru New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2009
    Сообщения:
    7
    ну результат 3 пункта это же ah, значит xor dx,ah, потому что в dx вроде записывается остаток
    add это же вроде и для двоичного и шестнатиричного, только для шестнатиричного нужно сделать корректировку daa, вроде бы...
     
  7. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Твой вариант неправилен - он уничтожает все остальные разряды, сохраняя только разряды 0-2 в каждом байте. Если надо именно это, то делается легче:

    mov ax, A
    and ax, 0707h
    mov bl,ah
    mov ah,al
    mov al,bl

    Правильный вариант как-то так (именно поменять местами, только разряды 0-2 в каждом байте слова, сохраняя значение остальных разрядов прежним):

    mov ax, A
    mov bx, ax
    and ax, 0707h
    and bx, 0f8f8h
    rol ax, 8
    or ax, bx

    Твой вариант не правильный. Ты не складываешь, а делаешь операцию ИЛИ. Это иногда называют "логическое сложение", но не двоичное явно. Формулировка скорее подразумевает обычное сложение беззнаковых целых. Не бинарно-десятичных.

    mov ax, [C]
    add ax, [D]

    Да, почти правильно. При условии, что слагаемые - именно BCD-числа, а не мусор :)) И при условии, что за случаем переполнения (результат более 99, перенос) следить не надо. Коррекция выполняется с al, и должна идти сразу после операции сложения, поскольку опирается на флаги в результате этого сложения. Лучше написать:

    mov ax, B
    mov bx, A
    add al, bh
    daa

    Код (Text):
    1.       a equ 2438h
    2.       b equ 1329h
    3.       c dw -157
    4.       d dw 100
    У тебя A и B - 16-битные константы, а C и D - опять же 16-битные переменные. Ты пишешь
    Это бред. Если собираешься делить 16-битные, то делишь DX:AX на 16-битное. Получаешь остаток в DX, результат в AX.
    (про XOR слов не сказано ничего... И, если следовать здравому смыслу, при делении на 100 остаток будет не более 99)

    mov bl,al ;результат пункта 3 - БАЙТ!

    xor dx,dx
    mov ax, A
    div word ptr [D]

    xor dl, bl
     
  8. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    ЗЫ: Естественно, с xchg как минимум 1-е задание записывается изящнее...
    ЗЗЫ: Говоря о "бинарном сложении", препод мог иметь в виду что-то свое, или задание записано не дословно - так что ... вдруг и в самом деле OR? Но никаких коррекций после него делать не надо!
    ЗЗЗЫ: За 3-е задание без проверки переполнения после десятичной коррекции я бы сделал незачет. В смысле, отправил бы дописывать... И если исходные числа - заданные через equ константы, то можно выделить нужные байты с помощью препроцессора языка, что будет экономнее и логичнее.
    ЗЗЗЗЫ: 4-е правильно по любому... если не писать обработку переполнения в пункте 3 :-D
     
  9. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Ну по логике, во 2-м все-таки арифметическое сложение, т.к. в 3-м уже двоично-десятичное.
    Хитро вывернулся Интел с двоично-десятичной арифметикой, а в ЕС ЭВМ были команды и для BCD и для распакованных BCD и еще какой-то зонный формат.
    Коррекция для больше 99 - это уже типа на оценку 4-5.
    И 4-е задание тоже из той же оперы, т.к. использует результат 3-го.
     
  10. compbooks_ru

    compbooks_ru New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2009
    Сообщения:
    7
    Код (Text):
    1. mov ax, A
    2. mov bx, ax
    3. and ax, 0707h
    4. and bx, 0f8f8h  
    5. rol ax, 8
    6. or ax, bx
    прокоментируй эти строчки и почему с bx складываем 0f8f8h и что такое 0f8f8h?
     
  11. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    В задаче нужно поменять местами только биты 0-2. Маска 0f8f8h позволяет сохранить на месте остальные биты - 3-7.
     
  12. compbooks_ru

    compbooks_ru New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2009
    Сообщения:
    7
    mov ax, A
    and ax, 0707h
    mov bl,ah
    mov ah,al
    mov al,bl
    or al,ah

    а если так сделать? остальные биты удалятся? и маска 0f8f8h для всех слов используется или тока для a equ 2438h
     
  13. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    compbooks_ru
    Операция AND - это не сложение. Это - чтоб проще и к нашему случаю, сохранение всех битов, которые в маске =1, и обнуление всех, которые в маске =0. У тебя есть некое число А, 16 бит, =2438h. Это значит,

    00100100 00111000 двоичное
    Задача состоит в том, чтобы поменять местами биты 0-2 старшего байта и биты 0-2 младшего байта. То есть, получить
    00100000 00111100.

    Маска, сохраняющая только биты 0-2 в обоих байтах: 00000111 00000111 (или 0707h)
    Маска, сохраняющая все остальные биты, кроме 0-2: 11111000 11111000 (или 0f8f8h)

    Поэтому, если тебе надо оставить в итоге только биты 0-2 в обоих байтах, то смело уничтожаем все остальное:
    mov ax, A
    and ax, 0707h
    xchg al, ah

    А если требуется сохранить биты 3-7 в обоих байтах как было, то надо сделать копию числа (например, в другом регистре), в которой их выделить (с помощью обратной маски, 0f8f8h), а потом слить (операцией OR) результат перестановки и сохраненные биты 3-7:

    mov ax, A
    mov bx, ax
    and ax, 0707h
    and bx, 0f8f8h
    xchg al,ah
    or ax,bx
     
  14. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    возьми отладчик, обычный debug (командная строка - debug.exe). Набери в нем "a100" и введи по порядку свой код:
    mov ax, 2438
    and ax, 0707
    mov bl, ah
    mov ah, al
    mov al, bl
    or al, ah
    (просто enter, чтоб выйти из режима ввода команд)
    Введи "r" (для первой команды) а потом "p" (для всех последующих) столько раз, сколько надо. Тебе будет выдавать текущее значение регистров (в результате выполнения последней команды) и следующую команду, которая будет выполнена. Следи за изменением регистра ax. Если получится то, что надо - ты прав. Если нет - ты накосячил. Надеюсь, мы не вернемся больше к этому вопросу :)
     
  15. compbooks_ru

    compbooks_ru New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2009
    Сообщения:
    7
    спасибо большое всем!)