вообщем нужно сделать это: 1. Поменять местами 0-2 разряды младшего и старшего байтов в слова А 2. Сложить С и D в двоичном виде 3. Выделить старший байт А и младший байт В и сложить их как два двоично-десятичных числа 4. Разделить А на D и остаток от деления объединить по "исключающему ИЛИ" с результатом п.3 я сделал первые 2 пункта: Code (Text): .model tiny .data a equ 2438h b equ 1329h c dw -157 d dw 100 .code .startup ;1 mov ax,a and ax,0007h mov bx,a and bx,0700h mov cl,8 shl ax,cl shr bx,cl or ax,bx ;2 mov cx,c mov dx,d or cx,dx das .exit end проверьте пожалуйста первые 2 пункта и помогите дописать 3 и 4)
Ну ты крут! Даже для Beginners эти вопросы слишком тривиальны. 3) Аналогичен и проще пункта 1, т.к. старший байт - это AH, а младший - BL 4) Сложно разжевать - начинающим рекомендуется читать что-нибудь по ассемблеру, там это есть. Про деление. XOR - это азбука.
;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?
В 3-м add - это бинарное сложение. А нужно сложение в BCD. Я не помню, есть оно у Интела? В 4-м пункте ошибка. XOR делается не с DX, а с результатом из 3го алгоритма. Т.е. опять повторяем все, что в 3-м, сохраняем результат, например в bl, и потом ксорим именно с ним.
ну результат 3 пункта это же ah, значит xor dx,ah, потому что в dx вроде записывается остаток add это же вроде и для двоичного и шестнатиричного, только для шестнатиричного нужно сделать корректировку daa, вроде бы...
Твой вариант неправилен - он уничтожает все остальные разряды, сохраняя только разряды 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 Code (Text): a equ 2438h b equ 1329h c dw -157 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
ЗЫ: Естественно, с xchg как минимум 1-е задание записывается изящнее... ЗЗЫ: Говоря о "бинарном сложении", препод мог иметь в виду что-то свое, или задание записано не дословно - так что ... вдруг и в самом деле OR? Но никаких коррекций после него делать не надо! ЗЗЗЫ: За 3-е задание без проверки переполнения после десятичной коррекции я бы сделал незачет. В смысле, отправил бы дописывать... И если исходные числа - заданные через equ константы, то можно выделить нужные байты с помощью препроцессора языка, что будет экономнее и логичнее. ЗЗЗЗЫ: 4-е правильно по любому... если не писать обработку переполнения в пункте 3 :-D
Ну по логике, во 2-м все-таки арифметическое сложение, т.к. в 3-м уже двоично-десятичное. Хитро вывернулся Интел с двоично-десятичной арифметикой, а в ЕС ЭВМ были команды и для BCD и для распакованных BCD и еще какой-то зонный формат. Коррекция для больше 99 - это уже типа на оценку 4-5. И 4-е задание тоже из той же оперы, т.к. использует результат 3-го.
Code (Text): mov ax, A mov bx, ax and ax, 0707h and bx, 0f8f8h rol ax, 8 or ax, bx прокоментируй эти строчки и почему с bx складываем 0f8f8h и что такое 0f8f8h?
В задаче нужно поменять местами только биты 0-2. Маска 0f8f8h позволяет сохранить на месте остальные биты - 3-7.
mov ax, A and ax, 0707h mov bl,ah mov ah,al mov al,bl or al,ah а если так сделать? остальные биты удалятся? и маска 0f8f8h для всех слов используется или тока для a equ 2438h
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
возьми отладчик, обычный 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. Если получится то, что надо - ты прав. Если нет - ты накосячил. Надеюсь, мы не вернемся больше к этому вопросу