Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
Другие темы раздела
Assembler Изменить формулу в программе Вообщем такие делишки... Как не крутил- не получается... Дана программа на Ассемблере и нужно её преобразовать. В программе реализуется формула 100-(P*100)/M, а мне нужно преобразовать её в P(100+N)-MS . Вот, собственно, данный неисправленный код: ; Форма "Сахарок" закупила М тонн сахара. В результате аварии системы отопления на складе ; Форма "Сахарок" закупила М тонн сахара. В результате... https://www.cyberforum.ru/ asm-beginners/ thread1128586.html Assembler Не вписывается в регистр цифра
Что ему не так? Вроде всецело адекватное действие.
Assembler Это ассемблер какой? https://www.cyberforum.ru/ asm-beginners/ thread1128357.html
Это ассемблер какой- MASM TASM или какой-либо еще, любопытно? Может кто-н написать об определениях? seg000:0100 ; seg000:0100 ; +-------------------------------------------------------------------------+ seg000:0100 ; | This file has been generated by The Interactive Disassembler (IDA) | seg000:0100 ; | Copyright (c) 2011 Hex-Rays, <support@hex-rays.com> |...
Assembler написать программу считывание трехзначные шестнадцатеричные числа Всем привет, помогите написать программу считывание трехзначные шестнадцатеричные числа . На данный момент у меня есть программа для ввода двузначного шестнадцатеричного числа: 0ABD:0100 B401 MOV AH,01 ;устанавливаем функцию запроса символа 0ABD:0102 CD21 INT 21 ;запрашиваем символ старшей цифры 0ABD:0104 88C2 MOV DL,AL ;копируем код символа в DL 0ABD:0106 80EA30 SUB DL,30 0ABD:0109 80FA09... https://www.cyberforum.ru/ asm-beginners/ thread1128268.html
Замена елементов Assembler
Привет всем,ребят может кто помочь,очень сильно нужна помощь нужно решить правую и нижнюю задачу
Assembler Проверка нажатия клавиши https://www.cyberforum.ru/ asm-beginners/ thread1127911.html
Написать программу, которая проверяет нажатие клавиш Alt+F10 , а также буквы "P" и "U".
Assembler Создать батник для программы https://www.cyberforum.ru/ asm-beginners/ thread1127767.html
Наверняка этот вопрос задавался, но что-то не получилось самостоятельно найти ответ. Только начал изучать ассемблер, и столкнулся с такой проблемой, что есть программа на одном диске, на другом диске установленный MASM, как составить батник так, чтобы программа компилировалась и линковалась не в папку masm/bin, а в папку, где лежит .asm-файл?
Перевод из восьмеричной в десятичную с/с Assembler
Нужно написать программу, которая переводит любое двузначное число из восьмеричной в десятичную систему счисления с помощью XLAT.
Assembler Задать одномерный массив, состоящий из Х элементов (Х задается преподавателем из диапазона [7.10]). Заполнить массив константами. Переместить заданны Задать одномерный массив, состоящий из Х элементов (Х задается преподавателем из диапазона ). Заполнить массив константами. Переместить заданный массив в другую область памяти, поменяв местами элементы с четными и нечетными номерами (поставив каждый элемент с четным номером на место нечетного элемента и каждый элемент с нечетным номером – на место четного) а) элементы массива – однобайтовые;... https://www.cyberforum.ru/ asm-beginners/ thread1127684.html Assembler Действия в коде https://www.cyberforum.ru/ asm-beginners/ thread1127651.html
Помогите, пожалуйста, разобраться. У меня есть переменная С, она объявлена по адресу 0007. В mov BX, OFFSET C+1, в ВХ помещается значение адреса С+1, т.е. 0008. А потом есть такая строчка: add , bx. Что здесь происходит? В память ВХ записывается +bx?
Работа с MBR Assembler
Помогите пожалуйста написать 3 задачи на ассемблере. Тема: работа с главной загрузочной записью. Вот,собственно, и сами задачи: 1. Написать программу, выводящую на экран содержимое таблицы разделов первого диска, выполняя чтение первого сектора диска с помощью BIOS-прерывания 13h. 2. Написать программу, выводящую на экран содержимое загрузочной записи для указанного логического диска....
Assembler 62-я функция https://www.cyberforum.ru/ asm-beginners/ thread1127587.html
Здравствуйте! Может мне кто-то помочь понять, в чем суть 62-й функции 21-го прерывания? mov ah, 62h mov al, 00h В 1-й строчке это получение PSP? Что тогда происходит во 2-й?
0 / 0 / 0
Регистрация: 10.01.2014
Сообщений: 39
0

Команды сложения и вычитания - Assembler - Ответ 5945830

24.03.2014, 20:18. Показов 52017. Ответов 2
Метки (Все метки)

Author24 — интернет-сервис помощи студентам
Лабораторная работа №2
«Изучение команд сложения и вычитания»

Цель работы: изучить форматы и правила работы с командами сложения и вычитания микропроцессора i8086.

Оборудование: IBM - совместимый персональный компьютер, работающий под управлением операционной системы, совместимой с MS-DOS®.

Краткие теоретические сведения.

1. Форматы арифметических данных
2. Команды сложения
3. Команды вычитания
4. Команда обращения знака
5. Команды расширения знака

Форматы арифметических данных.
Двоичные числа могут иметь 8 или 16 битов и могут быть со знаком или без знака. У числа без знака все 8 или 16 битов представляют его значение. Следовательно, двоичные числа без знака могут принимать значения от 0 до 255 (8-битовые) или до 65535 (16-битовые). У числа со знаком старший бит (7 или 15) указывает его знак, а остальные биты содержат значение числа. Следовательно, числа со знаком могут принимать значения от -128 до 127 (8-битовые) или от -32768 до 32767 (16-битовые).
Десятичные числа
Микропроцессор 8x86 хранит десятичные числа в виде последователь¬ностей байтов без знака в упакованном или неупакованном формате. Каждый байт упакованного десятичного числа содержит две цифры а двоично-десятичном коде BCD (binary-coded decimal). При этом код старшей цифры числа занимает четыре старших бита байта. Следовательно, один упакованный десятичный байт может содержать значения от 00 до 99.
Каждый байт неупакованного десятичного числа содержит только один двоич¬но-десятичный код цифры в четырех младших битах. Следовательно, один неупа¬кованный десятичный байт может содержать лишь значение от 0 до 9. При умноже¬нии и делении четыре старших бита должны быть нулевыми, а при сложении или вычитании их значение несущественно.
Как же микропроцессор 8x86 узнает, с каким видом данных он имеет дело? Пусть требуется сложить два байта. Как он определяет, какие числа они представ¬ляют (двоичные числа со знаком, двоичные числа без знака, упакованные деся¬тичные числа или неупакованные десятичные числа)? На самом деле микропро¬цессор 8x86 об этом совершенно не заботится и трактует все операнды только как двоичные числа.
Это хорошо в том случае, когда Ваши операнды и в самом деле являются двоичными числами, но если они оказались десятичными, то результаты, конечно, будут ошибочными. Для компенсации таких ошибок микропроцессор 8x86 имеет группу команд коррекции, которые обеспечивают получение правильного резуль¬тата после выполнения операций над десятичными числами. Эти команды будут обсуждаться далее.
Хранение чисел в памяти
Как уже упоминалось, микропроцессор 8x86 хранит 16-битовые числа в порядке, противоположном естественному представлению, а именно он хранит младшие биты числа в байте с меньшим адресом. Например, при запоминании числа 1234Н в ячейке по имени NUM он размещает 34Н по адресу NUM, a 12H — по адресу NUM+1. При чтении изображения (или дампа) содержимого памяти учиты¬вайте эту схему свертки байтов. Запомните фразу: "младший байт — младший адрес, старший байт — старший адрес".

Команды сложения.

Команда сложения ADD и команда сложения с добавлением переноса ADC.
Команды ADD (add - сложить) и ADC (add with carry - сложить с переносом) могут складывать как 8-, так и 16-битовые операнды. Команда ADD складывает содержимое операнда-источника и операнда-приемника и помещает результат в операнд-приемник. В символической нотации ее действия можно описать как
приемник = приемник + источник
Команда ADC делает то же, что и команда ADD, но при сложении использует также флаг переноса CF, что можно записать следующим образом:
приемник = приемник + источник + перенос
Перенос при сложении двоичных чисел аналогичен переносу при сложении десятичных чисел в столбик. Например, пои сложении
98
+ 13
79
190
возникает два переноса: сложение единиц вызывает добавление 2 к десяткам, а сложение десятков и перенос из столбца единиц вызывает другой перенос, а именно числа 1 в столбец сотен. Перенос возникает тогда, когда сумма цифр столбца в нем не помещается.
Аналогичным образом возникает перенос, когда ЭВМ складывает двоичные числа: если сумма не помещается в операнде-приемнике, то генерируется перенос. Как известно, 8-битовый регистр может содержать значения без знака в диапазоне от 0 до 255. Если мы, например, выполним двоичное сложение чисел 250 и 10, то ПОЛУЧИМ

1111 1010 (двоичное представление числа 250)
+ 0000 1010 (двоичное представление числа 10)
1 0000 01000 (ответ: десятичное значение 260)
Результат верен, но занимает 9 двоичных битов! Если при выполнении этой опера¬ции мы использовали 8-битовые регистры, то младшие 8 битов будут занесены в регистр-приемник, а девятый бит - во флаг переноса CF.
Теперь Вам нетрудно понять, почему микропроцессор 8x86 имеет две разные команды сложения. Одна из них (ADD) может складывать значения, представля¬емые байтами или словами, а также младшие части значений повышенной точнос¬ти. Другая команда (ADC) используется для сложения старших частей значений повышенной точности.
Например, команда
ADD AX,CX
складывает 16-битовые значения регистров АХ и СХ и возвращает результат в регистр АХ. Если Ваши операнды имеют длину более 16 битов, то можно восполь¬зоваться последовательностью команд вида
ADD АХ,СХ ; Сначала сложить младшие 16 битов, а затем
ADC BX,DX ; старшие 16 битов
которая складывает 32-битовое число, находящееся в регистрах СХ и DX, с 32-би¬товым числом, находящимся в регистрах АХ и ВХ. Использованная здесь команда ADC добавляет к (DX)+(BX) любой перенос от сложения (СХ)+(АХ).
Вы можете также добавлять находящийся в памяти операнд к регистру и наоборот или добавлять непосредственный операнд к регистру или операнду, находящемуся в памяти. Приведем несколько примеров:
ADD AX,MEM_WORD ;Добавить значение ячейки памяти к регистру
ADD MEM_WORD,AX ;или наоборот
ADD АL,10 ;Добавить константу к регистру
ADD MEM_BYTE,OFH ;или к ячейке памяти
Допускается большинство возможных комбинаций, но нельзя добавить значение одной ячейки памяти к другой или использовать в качестве приемника непосред¬ственное значение.
Команды ADD и ADC могут воздействовать на шесть флагов:
Флаг переноса CF равен 1, если результат сложения не помещается в операн¬де-приемнике; в противном случае он равен 0.
Флаг четности PF равен 1, если результат имеет четное число битов со значени¬ем 1; в противном случае он равен 0.
Вспомогательный флаг переноса AF равен 1, если результат сложения десятич¬ных чисел требует коррекции; в противном случае он равен 0.
Флаг нуля ZF равен 1, если результат равен 0; в противном случае он равен 0.
Флаг знака SF равен 1, если результат отрицателен (старший бит равен 1); в противном случае он равен 0.
Флаг переполнения OF равен 1, если сложение двух чисел одного знака (оба положительные или оба отрицательные) приводит к результату, который превышает диапазон допустимых значений приемника в обратном коде, а сам приемник при этом меняет знак. В противном случае флаг OF равен 0.
Флаги SF и OF имеют смысл только при сложении чисел со знаком, а флаг AF -только при сложении десятичных чисел.
Микропроцессор 8x86 имеет команды, которые проверяют флаги и на основе результатов проверки принимают решение о том, куда передать управление. Например, при отрицательном результате (SF=1) должна исполняться одна группа команд, а при положительном (SF=0) — другая. Эти команды "принятия решения" будут обсуждаться ниже.

Коррекция результата сложения для представления в кодах ASCII и в упакованном десятичном формате (команды AAA и DAA).
Как уже упоминалось, при выполнении сложения микропроцессор 8x86 рассматривает операнды как двоичные числа. Что же произойдет, если они будут двоично-десятичными кодами чисел (кратко десятичными или BCD-числа¬ми)? Разберемся в этом на примере. При сложении упакованных BCD-чисел 26 и 55 микропроцессор 8x86 выполнит следующее двоичное сложение:

00100110 (BCD-число 26)
+01010101 (BCD-число 55)
01111011 (??)
Вместо правильного значения (BCD-число 81) мы получим результат, у которого старшая цифра 7, а младшая - шестнадцатеричная цифра В. Означает ли это, что нельзя складывать десятичные числа? Нет, это означает лишь то, что результат должен быть скорректирован для представления в десятичной форме.
Коррекция результата сложения десятичных чисел осуществляется командами ААА (ASCII adjust for addition - скорректировать результат сложения для представ¬ления в кодах ASCII) и DAA (Decimal adjust for addition - скорректировать сложе¬ние для представления в десятичной форме). В них не требуется наличия операн¬да: предполагается, что корректируемое значение находится в регистре AL.
Команда ААА преобразует содержимое регистра AL в правильную неупакован¬ную десятичную цифру в младших четырех битах регистра AL (и заполняет нуля¬ми старшие четыре бита). Она используется в следующем контексте:

ADD AL,BL ;Сложить неупакованные числа, находящиеся в AL и BL
ААА ; и преобразовать результат в неупакованное число
Если результат превышает 9, то команда ААА добавляет 1 к содержимому регист¬ра АН (чтобы учесть избыточную цифру) и полагает флаг CF равным 1; в против¬ном случае она обнуляет флаг CF. Кроме того, команда ААА изменяет состояние флага AF и оставляет значения флагов PF, ZF, SF и OF неопределенными. Но так как в данном случае только флаг CF имеет смысл, то считайте значения остальных флагов уничтоженными.
Команда DAA преобразует содержимое регистра AL в две правильные упако¬ванные десятичные цифры. Она используется в следующем контексте:

ADD AL,BL ;Сложить упакованные BCD-числа в AL и BL
DAA ; и преобразовать результат в упакованное число
Если результат превышает предельное значение для упакованных BCD-чисел (99), то команда DAA добавляет 1 к содержимому регистра АН и полагает флаг CF равным 1. Кроме того, команда DAA изменяет состояния флагов PF, AF, ZF и CF и оставляет значение флага OF неопределенным. Но так как в данном случае только флаг CF имеет смысл, то считайте остальные пять флагов уничтоженными.

Команда приращения значения приемника на единицу
Команда INC (increment - прирастить) добавляет 1 к содержимому регистра или ячейки памяти, но в отличие от команды ADD не воздействует на флаг переноса CF. Команда INC удобна для приращения значений счетчиков в циклах команд. Ее можно использовать и для приращения значения индексного регистра или указателя при доступе к последовательно расположенным ячейкам памяти.
Приведем несколько примеров:
INC CX ;Прирастить значение 16-битового
INC AL ;или 8-битового регистра
INC MEM_ВYТЕ ;Прирастить значение байта
INC MEM_WORD[BX] ;или слова памяти

Как ни странно, приращение значения 8-битового регистра отнимает у микро¬процессора 8x86 больше времени, чем приращение значения 16-битового регистра. Это вызвано тем, что разра¬ботчики фирмы Intel предполагали, что программисты будут чаще пользоваться счетчиками размером в слово, а не байт, и предусмотрели специальную однобай¬товую версию команды INC для 16-битовых регистров.

Команды вычитания. Выполнение вычитания микропроцессором 8086.
Внутри микропроцессора 8x86, как и любого другого микропроцессора общего назначения, нет устройства вычитания. Однако он имеет устройство сложения (сумматор) и может вычитать числа путем сложения. Хотя это и может показаться странным, тем не менее это концепция, как сказал бы Шерлок Холмс, "элементарна".
Чтобы понять, как можно вычитать путем сложения, посмотрим, как вычесть 7 из 10. В начальной школе учат записывать это как
10-7,
но в старших классах (скажем, в курсе алгебры) учат и другому способу записи:
10+(-7).
Первым способом (непосредственное вычитание) вычитание может быть выпол¬нено микропроцессором, имеющим устройство вычитания. Так как микропроцес¬сор 8x86 его не имеет, то он вычитает в два приема. Сначала он меняет знак у вычитаемого (у второго числа), т.е. обращает его, а затем складывает уменьшае¬мое и обращенное вычитаемое. Так как микропроцессор 8x86 оперирует двоичны¬ми числами, то обращение знака числа производится путем так называемого дополнения до двух.
Чтобы выполнить дополнение до двух, берется исходная форма двоичного числа и значение каждого его бита обращается (каждый 0 заменяется на 1, а 1 — на 0), а затем к полученному числу добавляется 1.
Применяя это к нашему примеру, получаем 8-битовые представления чисел 10 и 7: 00001010В и 00000111В соответственно. Затем дополним двоичное представле¬ние 7 до двух:
1111 1000 (обратить все биты)
+_____1 (добавить 1)
1111 1001 (дополнение до двух числа 7, или - 7).
Теперь операция вычитания примет следующий вид:

0000 1010 (10)
+1111 1001 (-7)
0000 0011 (Ответ: 3)
Эврика! Мы получили правильный ответ!
Так как микропроцессор 8x86 выполняет дополнение до двух автоматически, то Вам эта операция понадобится в редких случаях. Позже в этом разделе мы рассмотрим команду NEG, посредством которой можно выполнить дополнение до двух, если оно когда-либо Вам понадобится.

Команда вычитания SUB и вычитания с заемом SBB.
Команды SUB (substract - вычесть) и SBB (substract with borrow - вычесть с заемом) аналогичны соответственно командам сложения ADD и ADC, только при вычитании флаг переноса CF действует как признак заема. Команда SUB вычитает операнд-источник из операнда-приемника и возвращает результат в операнд-приемник, т.е.

приемник = приемник — источник

Команда SBB делает то же самое, но дополнительно вычитает значение флага переноса CF:
приемник = приемник - источник - перенос
Как и в случае сложения, команды вычитания выполняют две отдельные функ¬ции. Первая команда SUB вычитает числа размером в байт или слово, а также младшие биты чисел повышенной точности. Другая команда SBB вычитает старшие биты чисел повышенной точности. Например, команда
SUB AХ,СХ
вычитает содержимое регистра СХ из содержимого регистра АХ и возвращает результат в регистр АХ.
Если размеры операндов превышают 16 битов, то пользуйтесь последователь¬ностью команд вида
SUB AX,BX ;Вычесть младшие 16 битов,
SBB BX,DX ; а затем — старшие 16 битов
Здесь мы вычитаем 32-битовое число, помещенное в регистры СХ и DX, из 32-бито¬вого числа, помещенного в регистры АХ и ВХ. При вычитании содержимого регист¬ра DX из содержимого регистра ВХ команда SBB учитывает возможность заема при выполнении первого вычитания.
Можно вычитать из содержимого регистра содержимое ячейки памяти (и наоборот) или вычитать из содержимого регистра либо ячейки памяти непосредст¬венное значение. Ниже приведены примеры допустимых команд:
SUB AХ,MEM_WORD ; Вычесть из регистра содержимое ячейки памяти
SUB MEM_WORD[BX],AХ ; или наоборот
SUB AL,10 ; Вычесть константу из регистра
SUB MEM_BYTE,OFH ; или из ячейки памяти
Нельзя непосредственно вычесть значение одной ячейки из другой или использо¬вать непосредственное значение как приемник.
Команды SUB и SBB могут воздействовать на шесть флагов следующим обра¬зом:
Флаг переноса CF равен 1, если требуется заем; в противном случае он равен 0.
Флаг четности PF равен 1, если результат вычитания имеет четное число битов со значением 1; в противном случае он равен 0.
Вспомогательный флаг переноса AF равен 1, если результат вычитания десятич¬ных чисел требует коррекции; в противном случае он равен 0.
Флаг нуля ZF равен 1, если результат равен 0; в противном случае он равен 0.
Флаг знака SF равен 1, если результат отрицателен (старший бит равен 1); в противном случае он равен 0.
Флаг переполнения OF равен 1, если при вычитании чисел, имеющих разные знаки, результат превышает диапазон значений приемника в обратном коде, а сам приемник изменяет знак; в противном случае флаг OF равен 0.
Флаги SF и OF имеют смысл только при вычитании чисел со знаком, а флаг AF – только при вычитании десятичных чисел.

Коррекция результата вычитания для представления в кодах ASCII и в упакованном десятичном формате (команды AAS и DAS).
При вычитании, как и при сложении, микропроцессор 8x86 рассматри¬вает операнды как двоичные числа. Поэтому вычитание чисел, представленных в двоично-десятичном коде (BCD-чисел), может привести к неправильным результа¬там. Предположим, например, что надо вычесть BCD-число 26 из BCD-числа 55. Микропроцессор 8x86 выполнит двоичное вычитание следующим образом: допол¬нит до двух двоично-десятичное представление числа 26, а затем выполнит сложе¬ние:
0101 0101 (BCD-число 55)
+ 1101 1010 (дополнение до двух BCD-числа 26)
1 0010 1111 (??).
Вместо правильного значения (BCD-числа 29) мы получили результат, у которого старшая цифра 2, младшая цифра - шестнадцатеричная цифра F, и при этом бит переноса равен 1. Конечно, этот результат требует коррекции.
Коррекция результата вычитания двух десятичных чисел осуществляется командами AAS (ASCII adjust for substraction - скорректировать вычитание для представления в кодах ASCII) и DAS (Decimal adjust for substraction - скорректиро¬вать вычитание для представления в десятичной форме). При их исполнении предполагается, что корректируемое число находится в регистре AL.
Команда AAS преобразует содержимое регистра AL в правильную неупакован¬ную десятичную цифру в младших четырех битах регистра AL (и обнуляет старшие четыре бита). Она используется в следующем контексте:
SUB AL,BL ; Вычесть BCD-число (содержимое BL) из AL
AAS ; и преобразовать результат в неупакованное число
Если результат превышает 9, то команда AAS вычитает 1 из содержимого регистра АН и полагает флаг CF равным 1, в противном случае она обнуляет флаг CF. Кроме того, команда AAS изменяет состояние флага AF и оставляет значения флагов PF, ZF, SF и OF неопределенными. Но так как в данном случае только флаг CF имеет смысл, то считайте значения остальных флагов уничтоженными.
Команда DAS преобразует содержимое регистра AL в две правильные упако¬ванные десятичные цифры. Она используется в следующем контексте:
SUB AL,BL ;Вычесть упакованное BCD-число(содержимое) BL из AL
DAS ; и преобразовать результат в упакованное число
Если результат превышает предельное значение для упакованных BCD-чисел (99), то команда DAS вычитает 1 из содержимого регистра АН и полагает флаг CF равным 1; в противном случае она обнуляет флаг CF. Кроме того, команда DAS изменяет состояния флагов PF, AF, ZF и SF, а значение флага OF оставляет неопре¬деленным. Но так как в данном случае только флаг CF имеет смысл, то считайте остальные упомянутые флаги уничтоженными.

Команда уменьшения содержимого приемника на единицу DEC
Команда DEC (decrement - уменьшить) вычитает 1 из содержимого регистра или ячейки памяти, но при этом (в отличие от команды SUB) не воздейст¬вует на флаг переноса CF. Команда DEC часто используется в циклах для умень¬шения значения счетчика до тех пор, пока оно не станет нулевым или отрицатель¬ным. Ее можно использовать также для уменьшения значения индексного регистpa или указателя при доступе к последовательно расположенным ячейкам памя¬ти.
Приведем несколько примеров:

DEC CX ;Уменьшить знамение 16-битового
DEC AL ; или 8-битового регистра
DEC MEM_BYTE ;Уменьшить значение байта
DEC MEM_WORD[BX] ;или слова памяти

Команда обращения знака NEG.
Команда NEG вычитает значение операнда-приемника из нулевого значения и тем самым формирует его дополнение до двух. Команда NEG оказыва¬ет на флаг то же действие, что и команда SUB. Но поскольку один из операндов равен 0, то можно точнее описать условия изменения состояний флагов. Итак, при исполнении команды NEG флаги изменяются следующим образом:
Флаг переноса CF и флаг знака SF равны 1, если операнд представляет собой ненулевое положительное число; в противном случае они равны 0.
Флаг четности PF равен 1, если результат имеет четное число битов, равных 1; в противном случае он равен 0.
Флаг нуля ZF равен 1, если операнд равен 0; в противном случае он равен 0.
Флаг переполнения OF равен 1, если операнд-байт имеет значение 80Н или операнд-слово имеет значение 8000Н; в противном случае он равен 0.
Команда NEG полезна для вычитания значения регистра или ячейки памяти из непосредственного значения. Например, Вам нужно вычесть значение регистра AL из 100. Так как непосредственное значение не может служить приемником, то команда SUB 100, AL недопустима. В качестве альтернативы можно обратить знак содержимого регистра AL и добавить к нему 100:

NEG AL
ADD AL,100

Команда расширения знака.
Существуют две команды, позволяющие выполнять операции над смешанными данными за счет удвоения размера операнда со знаком. Команда CBW (convert byte to word — преобразовать байт в слово) воспроизводит 7-й бит регистра AL во всех битах регистра AH.
Команда CWD (convert word to double word — преобразовать слово в двойное слово) воспроизводит 15-й бит регистра AX во всех битах регистра DX.
Таким образом, команда CBW позволяет сложить байт и слово, вычесть слово из байта и т. д. Аналогично, команда CWD позволяет разделить слово на слово.
Приведем несколько примеров:

CBW ;Сложить байт в AL со словом в BX
ADD AX,BX
CBW ;Умножить байт в AL на слово в BX
IMUL BX
CWD ;Разделить слово в AX на слово в BX
IDIV BX

Индивидуальное задание.
Вычислить следующее выражение:

F = КОН1 оп1 (КОН2 оп2 Х оп3 Y) оп4 Z оп5 КОН3
где
КОН1, КОН2, КОН3 – числовые константы, согласно табл. 1
оп1, оп2, оп3, оп4, оп5 – операции сложения и вычитания согласно табл. 2
X, Y – переменные
Числовые константы из табл. 1 берутся согласно первой цифре варианта, операции сложения и вычитания из табл. 2 – согласно второй цифре варианта.
Исходные данные хранятся в памяти с адреса 0900H, вычисление выражения производится на Ассемблере, выводимые результаты — располагаются в памяти с адреса 1000Н.

КОН1
4589
КОН2
29
КОН3
562235
оп1

оп2

оп3
+
оп4
+
оп5
+
Пример. У студента индивидуальный вариант 9. Строим индивидуальное выражение для вычисления: F=458 – (481 + X + Y) + Z — 36

Ассемблерный фрагмент выглядит следующим образом:
mov bx, 481h // Пересылаем константу в регистр AX
mov al,x
cbw // Расширяем число X до 16 бит
add bx,ax // 481h + X
add bx, y // 481h + X + Y
mov al,z
cbw // Расширяем число Z до 16 бит
add bx,ax // (481h + X + Y) +Z
sub bx,36h // (481h + X + Y) +Z - 36h
mov cx, 458h
sub cx, ax
mov f,cx

Вернуться к обсуждению:
Команды сложения и вычитания Assembler
0
Заказать работу у эксперта
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.03.2014, 20:18
Готовые ответы и решения:

Операции целочисленного сложения и вычитания
Где можно найти подробную инфу об этих операциях?

Программа, выполняющая пересылки, операции сложения, вычитания
1. Очистить регистр СХ. 2. Переслать число xxh в регистр AL. 3. Добавить число xxxxh к регистру...

Примитивный калькулятор (два операнда и операции сложения, вычитания, умножения и деления)
Здравствуйте. Вот пытался написать примитивный калькулятор, которые будет +, -, * и / два...

Используя только операции сложения и вычитания, найти частное от деления нацело N на K
Даны целые положительные числа N и K. Используя только операции сложения и вычитания, найти частное...

2
24.03.2014, 20:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.03.2014, 20:18
Помогаю со студенческими работами здесь

Программа умножения двух целых чисел с использованием команд сложения, вычитания, сдвига
Программа умножения двух целых чисел с использованием команд сложения, вычитания, сдвига. (TASM) ...

Посчитать количесвто операций сложения,вычитания, умножения, сранвения при расчете экспоненты
По поводу экспаненты. Стоит задача посчитать количесвто операций сложения,вычитания, умножения,...

Дисассемблирование в оперативной памяти команды вычитания sub
Здравстуйте. Прошу помощи, вот задачка. Написать программу дисассемблирования в оперативной...

Команды передачи управления (команды условного и безусловного переходов)
Необходимо определить переменные А, В, С как знаковые байтовые переменные. Написать программу...

0
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru