РАССЫЛКИ ПОРТАЛА RFPRO.RU Лучшие эксперты по данной тематике Номер выпуска: | 1595 | Дата выхода: | 15.04.2016, 10:21 | Администратор рассылки: | Лысков Игорь Витальевич (Старший модератор) | Подписчиков / экспертов: | 17 / 8 | Вопросов / ответов: | 7 / 7 | Консультация # 189133: Здравствуйте! У меня возникли сложности с таким вопросом: Помогите написать код на языке ассемблера для решения данного уравнения ... Консультация # 189134: Уважаемые эксперты! Пожалуйста, ответьте на вопрос: Помогите пожалуйста написать код в ассемблере. ... Консультация # 189135: Здравствуйте! Прошу помощи в следующем вопросе: Помогите написать код программы на языке ассемблер для решения данного уравнения Заранее спасибо!... Консультация # 189136: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Может кто помочь написать комментарий к этой программе ... Консультация # 189137: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Рассчитать и вывести значение выражение, при заданных пользователем значениях x и a ... Консультация # 189138: Уважаемые эксперты! Пожалуйста, ответьте на вопрос: Вычислить значения в уравнение. Ассемблер TASM. Платформа Windows. ... Консультация # 189139: У важаемые эксперты! Пожалуйста, ответьте на вопрос: Доброго времени суток. Мне нужна ваша помощь! Суть задачи заключается в реализации знакового умножения. Задача: Даны два числа в двоичном виде(a: 10110101b; b: 00110111b). Обнулить в первом числе 3,5,6 разряды и разделить полученное на 8, второе умножить на 2 и логически сложить с пер... Консультация # 189133: Здравствуйте! У меня возникли сложности с таким вопросом: Помогите написать код на языке ассемблера для решения данного уравнения
Дата отправки: 09.04.2016, 10:12 Вопрос задал: vitya-titya (Посетитель) Всего ответов: 1 Страница онлайн-консультации » Консультирует Лысков Игорь Витальевич (Старший модератор): Здравствуйте, vitya-titya! Программа считает в целых числах. Вся эта дробь из-за того, что отбрасываются остатки, сводится к 0 Результат -34
.model small .data ;числа-константы из формулы C123 dw 123 C4 dw 4 C5 dw 5 C6 dw 6 C3 dw 3 C36 dw 36 C34 dw 34 sRes db 10,13,'Result: $' .stack 100h ;стек .code ;сегмент кода start: mov ax, @data mov ds, ax ;настраиваем сегментный регистр данных mov ax, С123 ;ax=123 sub ax, C4 ;ax=123-4 cwd ;готовимся к делению idiv C5 ;ax = dx:ax/5 = (123-4)/5, остаток в dx отбрасываем mov di, ax ;сохраним в di mov ax, C6 ;ax=6 sub ax, C3 ;ax=6-3 cwd ;готовимся к делению idiv C4 ;ax = dx:ax/4 = (6-3)/4, остаток в dx отбрасываем add di, ax ;di = (123-4)/5 + (6-3)/4 mov ax, C4 ;ax = 4 imul C3 ;dx:ax = 4*3, dx=0 отбрасываем add ax, C36 ;ax = 4*3 + 36 xchg ax, di ;меняем содержимое ax и di cwd ;готовимся к делению idiv di ;ax = ((123-4)/5 + (6-3)/4) / (4*3 + 36), остаток отбрасываем sub ax, C34 ;ax = ax - 34 ;выведем результат из ax push ax ;сохраним число в стеке mov ah, 9 lea dx, sRes int 21h ;выводим сообщение pop ax mov bx, 10 ;система счисления xor cx, cx ;счетчик в стеке test ax, ax ;проверим на знак числа jge div_loop ;>=0 просто выводим neg ax ;ax = -ax push ax ;сохраним mov dl, '-' ;выведем знак минуса mov ah, 2 int 21h pop ax div_loop: ;цикл получения цифр делением на 10 xor dx,dx div bx ;получаем младшую цифру push dx ;запоминаем в стеке inc cx ;считаем test ax,ax ;повторяем пока не ноль в ах jnz div_loop dig_loop: ;цикл вывода цифр в обратном порядке pop dx ;извлекаем цифру add dl,'0' ;переводим в символ mov ah, 2 int 21h ;выводим на экран loop dig_loop xor ax, ax ;ожидаем любую клавишу int 16h mov ax, 4C00h ;выход int 21h end start Консультация # 189134: Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
Помогите пожалуйста написать код в ассемблере.
Дата отправки: 09.04.2016, 10:15 Вопрос задал: shenae2009 (Посетитель) Всего ответов: 1 Страница онлайн-консультации » Консультирует Лысков Игорь Витальевич (Старший модератор): Здравствуйте, shenae2009! Вот и программа...
.model small .data ;числа-константы из формулы C24 dw 34 C4 dw 4 C5 dw 5 C6 dw 6 C36 dw 36 C37 dw 37 C8 dw 8 C3 dw 3 C2 dw 2 sRes db 10,13,'Result: $' .stack 100h ;стек .code ;сегмент кода start: mov ax, @data mov ds, ax ;настраиваем сегментный регистр данных mov ax, С24 ;24 mov bx, C4 ;4 xor dx, dx ;готовимся к делению idiv bx ;ax = dx:ax/bx = 24/4, остаток в dx отбрасываем mov di, ax ;сохраним в di mov ax, C5 ;5 imul C6 ;dx:ax = 5*6 add ax, di ;dx:ax = 5*6 + 24/4 adc dx, 0 ;на всякий случай, учтем перенос div C36 ;ax = dx:ax / 36 mov di, ax ;сохраним в di, остаток отбрасываем ;посчитаем вторую половину формулы mov ax, C8 ;8 imul C6 ;dx:ax = 8*6 add ax, C5 ;dx:ax = 8*6 + 5 adc dx, 0 ;учитываем возможный перенос div C3 ;ax = dx:ax / 3 mov si, ax ;сохнаним частное, остаток в dx отбрасываем mov ax, C3 ;3 imul C2 ;dx:ax = 3*2, старшее слово отбрасываем add si, ax ;si = (8*6+5)/3 + 3*2 mov ax, C8 ;8 xor dx, dx ;dx:ax = 8 div C2 ;ax = dx:ax / 2, остаток в dx отбрасываем add ax, C3 ;ax = 8/2 +3 imul C37 ;dx:ax = 37 * (8/2 +3) idiv si ;ax = dx:ax / si = (37 * (8/2 +3)) / ((8*6+5)/3 + 3*2) add ax, di ;в ax окончательный резльтат ;выведем результат mov bx, 10 ;система счисления xor cx, cx ;счетчик в стеке div_loop: xor dx,dx div bx ;получаем младшую цифру push dx ;запоминаем в стеке inc cx ;считаем test ax,ax ;повторяем пока не ноль в ах jnz div_loop mov ah, 9 lea dx, sRes int 21h ;выводим сообщение dig_loop: pop dx ;извлекаем цифру add dl,'0' ;переводим в символ mov ah, 2 int 21h ;выводим на экран loop dig_loop xor ax, ax ;ожидаем любую клавишу int 16h mov ax, 4C00h ;выход int 21h end start  | Консультировал: Лысков Игорь Витальевич (Старший модератор) Дата отправки: 11.04.2016, 11:15 5 Спасибо большое, очень выручили! ----- Дата оценки: 11.04.2016, 11:36 | Рейтинг ответа: +1 | Консультация # 189135: Здравствуйте! Прошу помощи в следующем вопросе: Помогите написать код программы на языке ассемблер для решения данного уравнения Заранее спасибо! Дата отправки: 09.04.2016, 10:22 Вопрос задал: vitya-titya (Посетитель) Всего ответов: 1 Страница онлайн-консультации » Консультирует Зенченко Константин Николаевич (Модератор): Здравствуйте, vitya-titya!
Смотрите приложение:
model small data dbRes db 10,13,'Result:$' a dw 2 b dw 3 c dw 4 d dw 5 e dw 6 f dw 8 g dw 12 h dw 14 i dw 25 j dw 36 k dw 37 l dw 250 stack 100h code org 100h start: mov ax,@data mov ds,ax; mov ah,9 lea dx,dbRes; int 21h mov di,a;2 add di,b;2+3 shr di,1;(2+3)/2 mov si,j;36 sub si,c;36-4 mov ax,c;4 xor dx,dx mul e;4*6 mov bx,ax mov ax,i;25 xor dx,dx mul d;25*5 add ax,bx;(4*6+25*5) div si;(4*6+25*5)/(36-4) add di,si;(2+3)/2+(4*6+25*5)/(36-4) mov ax,l;250 shl ax,2;250*2 sub ax,h;250-14 div k;(250-14)/37 xchg di,ax; div di mov di,ax;((2+3)/2+(4*6+25*5)/(36-4))/((250-14)/37) mov ax,g;12 sub ax,c;12-4 mov si,k;37 sub si,f;37-8 mul si;(12-4)*(37-8) add ax,di xor cx,cx mov di,10 @@01: xor dx,dx; div di push dx; inc cx; or ax,ax; jnz @@01 @@02: pop ax; add al,'0'; int 29h loop @@02 mov ah,4Ch; int 21h end start ps:вопросы задавайте в мини-форуме. Удачи! Консультация # 189136: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Может кто помочь написать комментарий к этой программе
model small code szRow equ 6 szCol equ szRow start: mov ax,@data mov ds,ax mov ch,szRow+1 xor dx,dx xor bx,bx lRow: mov cl,szCol+1 xor di,di lCol: cmp cl,ch jle next mov al,mass[bx][di] test al,80h jnz next cbw add dx,ax next: inc di dec cl jnz lCol add bx,szCol dec ch jnz lRow mov sum,dx mov ah,4ch mov ah,1 int 21h data sum dw ? mass label byte dat = 0 rept szRow rept szCol db dat dat = (dat+szRow*szCol)mod 256 endm endm stack 256 end start Дата отправки: 09.04.2016, 10:24 Вопрос задал: Dron (Посетитель) Всего ответов: 1 Страница онлайн-консультации » Консультирует Лысков Игорь Витальевич (Старший модератор): Здравствуйте, Dron! 1) Комментариев сделал не просто много, а неприлично много 2) Ошибочки таки есть: неправильно задавались счетчики строк и столбцов и неправильно задавалась функция выхода из программы
model small ;модель памяти .code ;сегмент кода szRow equ 6 ;число строк матрицы szCol equ szRow ;колонок столько же, матрица квадратная start: mov ax, @data ;адрес сегмента данных в памяти mov ds, ax ;инициируем регистр сегмента данных ;далее идет подсчет суммы положительных элементов матрицы, ;расположенных ниже главной диагонали mov ch, szRow ;число строк xor dx, dx ;здесь будем накапливать сумму xor bx, bx ;база очередной строки матрицы lRow: mov cl, szCol ;цикл по строкам, число колонок в строке xor di, di ;индекс колонки в строке lCol: cmp cl, ch ;элементы на главной диагонали и выше jle next ; пропускаем mov al, mass[bx][di];берем элемент bx строки di столбца test al, 80h ;отрицательное число? jnz next ;рассматриваем только положительные числа cbw ;байт превращаем в слово add dx, ax ;складываем next: inc di ;на следующий элемент в строке dec cl ;уменьшаем счетчик колонок jnz lCol ;на следующую колонку строки add bx, szCol ;строка закончилась, смещаем базу строки на длину строки dec ch ;уменьшаем счетчик строк jnz lRow ;на следующую строку mov sum, dx ;строки кончились, сохраняем результат mov ah, 4ch ;ф-я завершения программы mov al, 1 ;код возврата int 21h .data ;сегмент данных sum dw ? ;здесь будет сумма mass label byte ;матрица szRow на szCol элементов ;далее задается содержимое матрица при помощи макро dat = 0 ;начальное значение данных rept szRow ;внешний цикл, повтор szRow раз rept szCol ;внутренний цикл, повтор szCol раз db dat ;байт, равный переменной dat dat = (dat+szRow*szCol)mod 256 ;следующее значение равно ;остатку от деления на 256 от суммы ;предыдущего значения и szRow*szCol=36 ;т.о., в матрице будут числа ;0, 36, 72, 108, 144, 180, 216, 252, 32, 72 и т.д. ;числа рассматриваются, как знаковые. ;т.е., если 0 <= число < 128, то положительное ;если 128 <= число < 256, то отрицательное, в доп коде endm ;конец внутреннего цикла endm ;конец внешнего цикла .stack 256 ;стек 100h байт end start ;точка входа в программу  | Консультировал: Лысков Игорь Витальевич (Старший модератор) Дата отправки: 09.04.2016, 15:14 5 нет комментария ----- Дата оценки: 09.04.2016, 22:08 | Рейтинг ответа: +1 | Консультация # 189137: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Рассчитать и вывести значение выражение, при заданных пользователем значениях x и a
Дата отправки: 09.04.2016, 10:30 Вопрос задал: ya.fynjygh2013 (Посетитель) Всего ответов: 1 Страница онлайн-консультации » Консультирует Лысков Игорь Витальевич (Старший модератор): Здравствуйте, ya.fynjygh2013! Вот Вам программа. Все вычисления производятся с вещественными числами.
.model small .data sEnterA db "Enter a = $" ;приглашение ввести а sEnterX db "Enter x = $" ;приглашение ввести х sY db "y = $" ;вывод y ;числа-константы из формулы c10 dw 10 ; 10 - кроме того, основание системы счисления c17 dw 17 c4 dw 4 c5 dw 5 c8 dw 8 c3 dw 3 c14 dw 14 c16 dw 16 c6 dw 6 ;буфер для ввода строки-вещественного числа max db 64 ;размер буфера len db ? ;реальная длина String db 64 dup (?) ;сама строка sTemp db 64 dup(?) ;временный буфер для формирования строки-числа dig dw ? ;цифра при обмене с сопроцессором a dd ? ;числа, которые вводятся x dd ? .code ;сегмент кода .386 ;необходимо для команды fsin .startup ;инициализация сегментов для выбранной модели памяти lea dx, sEnterA call InputFloat ;вводим а fstp a ;сохраним из стека сопроцессора в переменной а lea dx, sEnterX call InputFloat ;вводим х fstp x lea dx, sY ;выведем строку "y = " mov ah, 9 int 21h call CalcY ;считаем y по формуле, результат в стеке сопроцессора call float2str ;преобразуем вещ число в стеке сопроцессора в строку lea dx, String ;и выведем mov ah, 9 int 21h mov ah, 0 ;ждем нажатие на клавишу int 16h .exit 0 CalcY proc ;расчет по формуле fild C17 ;17 fimul C4 ;17*4 fld a ;a fimul C5 ;a*5 fild C8 ;8 fidiv C3 ;8/3 fsubp ;a*5 - 8/3 fld x ;x fsin ;sin(x) fimul C14 ;14*sin(x) fiadd C5 ;14*sin(x)+5 fidiv C4 ;(14*sin(x)+5)/4 fild C16 ;16 fimul C6 ;16*6 fiadd C5 ;16*6 + 5 fidiv C10 ;(16*6 + 5)/10 faddp ;(14*sin(x)+5)/4 + (16*6 + 5)/10 fdivp ;(a*5 - 8/3) / ((14*sin(x)+5)/4 + (16*6 + 5)/10) faddp ;17*4 + (a*5 - 8/3) / ((14*sin(x)+5)/4 + (16*6 + 5)/10) ret CalcY endp InputFloat proc ;ввод вещественного числа push dx ;сохраним адрес приглашения для повторного ввода mov ah, 9 ;выведем строку приглашения int 21h lea dx, max ;вводим строку mov ah, 0ah int 21h lea si, String ;адрес строки call str2float ;преобразовываем во float с проверкой синтаксиса pushf ;флаг С говорит о корректности строки, сохраним флажки mov ah, 2 mov dl, 0dh ;перевод на новую строку int 21h mov dl, 0ah int 21h popf ;восстановим флажки pop dx ;восстановим (уберем из стека) адрес приглашения jc InputFloat ;ошибка - на повтор ввода! ret ;введенное число в стеке сопроцессора InputFloat endp ;Преобразование строки в вещественное число в st сопроцессора str2float proc ;преобразование строки в вещественное число fldz ;подготовим st=0 xor dx, dx ;число знаков после точки = 0 xor bx, bx ;bl = 0/1 знак числа +/-, bh = 1/0 знак уже введен/не задан xor di, di ;число введенных цифр, для контроля позиции знака s2fNext: lodsb ;очередной символ cmp al, 0dh ;дошли до конца? je s2fSign ;учтем знак cmp al, '+' ;плюс? jne s2f_minus cmp bh, 0 ;знак уже был введен? jne s2f_err ;можно только раз test di, di jne s2f_err ;знак можно писать только в первой позиции mov bh, 1 ;знак задан jmp s2fNext s2f_minus: cmp al, '-' ;минус? jne s2f_point cmp bh, 0 ;знак уже был введен? jne s2f_err ;можно только раз test di, di jne s2f_err ;знак можно писать только в первой позиции mov bx, 0101h ;задаем знак - минус jmp s2fNext s2f_point: cmp al, '.' ;точка jne s2f_digit test dx, dx ;точку можно задать только один раз jne s2f_err jmp s2fInc s2f_digit: ;проверка на цифры cmp al, '0' jb s2f_err cmp al, '9' ja s2f_err inc di ;есть цифра and ax, 0fh ;готовим разряд mov dig, ax ; для загрузки в сопроцессор test dx, dx ;если целая часть, то je s2fMul10 ; на умножение на 10 mov cx, dx ;иначе делим dx раз на 10 fild dig ; очередной разряд s2fdiv: fidiv c10 ;делим dх раз loop s2fdiv faddp ;складываем разряд за точкой с формируемым числом s2fInc: inc dx ;для точки только увеличиваем dх jmp s2fNext ;пока не дойдем до конца s2fMul10: ;целое число fimul c10 ;умножаем старое на 10 fiadd dig ;и прибавляем очередной разряд jmp s2fNext s2fSign: ;ввод числа закончен, учтем знак cmp bl, 0 ;если - je s2fRet fchs ;то меняем знак s2fRet: clc ;все ок ret s2f_err: stc ;ошибочка fstp st ;выкидаем из стека число ret str2float endp ;преобразование вещественного числа из st в строку по адресу String float2str proc push es push ds pop es ;es=ds lea di, sTemp ;здесь будем формировать строку ftst ;Проверяем число fstsw ax ;флаги в ax sahf ;флаги в регистре флагов jnz f2s_notZero ;не 0 mov dx, 1 ;длина 1 mov bl, 0 ;сбрасываем знак mov ax, '0' ;если 0, то выводим 0 stosw jmp f2s_Ret ;на выход f2s_notZero: ;не 0 mov al, ' ' ; пока считаем, что положительное jnc f2s_sign ;если оно отрицательное, mov al, '-' ; то минус fchs ; и оставляем модуль числа. f2s_sign: stosb ;знак числа ; Пояснение далее пойдёт на примере. ; ST(0) ST(1) ST(2) ST(3) ... ; Отделим целую часть от дробной. ; 73.25 ... что-то не наше fld1 ; 1 73.25 ... fld st(1) ; 73.25 1 73.25 ... ; Остаток от деления на единицу даст дробную часть. fprem ; 0.25 1 73.25 ... ; Если вычесть её из исходного числа, получится целая часть. fsub st(2), st ; 0.25 1 73 ... fxch st(2) ; 73 1 0.25 ... ; Сначала поработаем с целой частью. Считать количество цифр будем в CX. xor cx, cx ; Поделим целую часть на десять, f2s_2: fidiv c10 ; 7.3 1 0.25 ... fxch st(1) ; 1 7.3 0.25 ... fld st(1) ; 7.3 1 7.3 0.25 ... ; отделим дробную часть - очередную справа цифру целой части исходного числа,- fprem ; 0.3 1 7.3 0.25 ... ; от чатсного оставим только целую часть fsub st(2), st ; 0.3 1 7 0.25 ... ; и сохраним цифру fimul c10 ; 3 1 7 0.25 ... fistp dig ; 1 7 0.25 ... inc cx ; в стеке. push dig fxch st(1) ; 7 1 0.25 ... ; Так будем повторять, пока от целой части не останется ноль. ftst fstsw ax sahf jnz f2s_2 ; Теперь выведем её. f2s_3: pop ax ; Вытаскиваем очередную цифру, переводим её в символ и выводим. add al, 30h stosb ; И так, пока не выведем все цифры. loop f2s_3 ; 0 1 0.25 ... ; Итак, теперь возьмёмся за дробную часть, для начала проверив её существование. fstp st(0) ; 1 0.25 ... fxch st(1) ; 0.25 1 ... ftst fstsw ax sahf jz f2s_5 ; Если она всё-таки ненулевая, выведем точку lea ax, sTemp mov cx, di sub cx, ax sub cx, 63 neg cx mov al, '.' stosb ; Помножим дробную часть на десять f2s_4: fimul c10 ; 2.5 1 ... fxch st(1) ; 1 2.5 ... fld st(1) ; 2.5 1 2.5 ... ; отделим целую часть - очередную слева цифру дробной части исходного числа,- fprem ; 0.5 1 2.5 ... ; оставим от произведения лишь дробную часть fsub st(2), st ; 0.5 1 2 ... fxch st(2) ; 2 1 0.5 ... ; сохраним полученную цифру во временной ячейке fistp dig ; 1 0.5 ... ; и сразу выведем. mov ax, dig add al, 30h stosb ; Теперь, если остаток дробной части ненулевой fxch st(1) ; 0.5 1 ... ftst fstsw ax sahf ; и мы вывели менее cx цифр, продолжим loopnz f2s_4 ; 0 1 ... ; Итак, число выведено. Осталось убрать мусор из стека. f2s_5: fstp st(0) ; 1 ... fstp st(0) ; ... mov byte ptr [di], '$' ;закроем строку знаком '$' для функции 9 ; и скопировать в буфер String не более 14 знаков lea si, sTemp lea di, String mov dx, 0 ;длина f2s_6: lodsb stosb ;копируем 1 байт inc dx ;считаем cmp dx, 14 ;копируем только 14 байт !!! (если получится число ; с большим чем 14 байт знаков, то последние усекутся) je f2s_7 ;насильно закрываем '$'! cmp al, '$' jne f2s_6 ;копирование завершаем по '$' dec dx ;отнимем 1 (посчитался байт '$') f2s_7: mov byte ptr [di], '$' ;закроем '$' (для случая обрезания) f2s_Ret: pop es ret float2str endp end  | Консультировал: Лысков Игорь Витальевич (Старший модератор) Дата отправки: 11.04.2016, 01:23 5 нет комментария ----- Дата оценки: 13.04.2016, 08:43 | Рейтинг ответа: +1 | Консультация # 189138: Уважаемые эксперты! Пожалуйста, ответьте на вопрос: Вычислить значения в уравнение. Ассемблер TASM. Платформа Windows.
Дата отправки: 09.04.2016, 10:31 Вопрос задал: vsib2012 (Посетитель) Всего ответов: 1 Страница онлайн-консультации » Консультирует Лысков Игорь Витальевич (Старший модератор): Здравствуйте, vsib2012! Исправленная программа Посмотрите сначала самостоятельно. Если будет что-то непонятно, потом напишу комментарии
data segment sRes db 'Y = $' y dw 0 ;здесь будет результат data ends _stack segment stack 'stack' dw 128 dup(?) ;стек лучше задавать не байтами, а словами _stack ends assume cs:code, ds:data, ss:_stack code segment start: mov ax, data mov ds, ax mov ax,49 ;ax = 49 mov bx,7 cwd ;dx:ax = 49 idiv bx ;ax = dx:ax / bx = 49 / 7, остаток dx игнорируем mov si,ax ;сохраним в si mov ax,42 ;ax = 42 mov bx,6 cwd ;dx:ax = 42 idiv bx ;ax = dx:ax / bx = 42 / 7, остаток dx игнорируем add si,ax ;si = 49/7 + 42/7 mov ax,6 ;ax = 6 mov bx,2 imul bx ;dx:ax = 6*2, старшее слово в dx игнорируем add si,ax ;si = 49/7 + 42/7 + 6*2 mov ax,8 ;ax = 8 mov bx,5 mul bx ;dx:ax = 8*5 mov bx,9 idiv bx ;ax = 8*5/9, остаток dx игнорируем mov di,ax ;сохраним в di mov ax,4 ;ax = 4 mov bx,6 imul bx ;dx:ax = 4*6, старшее слово в dx игнорируем sub di,ax ;di = 8*5/9 - 4*6 mov ax,si ;ax = 49/7 + 42/7 + 6*2 cwd ;dx:ax = 49/7 + 42/7 + 6*2 div di ;ax = (49/7 + 42/7 + 6*2) / (8*5/9 - 4*6), остаток dx игнорируем mov si, ax ;сохраним в si mov ax,23 ;ax = 23 add ax,12 ;ax = 23+12 mov bx,26 ;bx = 26 sub bx,4 ;bx = 26-4 cwd ;dx:ax = 23+12 div bx ;ax = (23+12)/(26-4), остаток dx игнорируем mov bx,5 mul bx ;dx:ax = ((23+12)/(26-4))*5 add ax, si ;ax = ((49/7+42/7+6*2)/(8*5/9-4*6))+((23+12)/(26-4))*5 mov [Y],ax ;сохраним результат ;выведем результат из ax push ax ;сохраним число в стеке mov ah, 9 lea dx, sRes int 21h ;выводим сообщение pop ax mov bx, 10 ;система счисления xor cx, cx ;счетчик в стеке test ax, ax ;проверим на знак числа jge div_loop ;>=0 просто выводим neg ax ;ax = -ax push ax ;сохраним mov dl, '-' ;выведем знак минуса mov ah, 2 int 21h pop ax div_loop: ;цикл получения цифр делением на 10 xor dx,dx div bx ;получаем младшую цифру push dx ;запоминаем в стеке inc cx ;считаем test ax,ax ;повторяем пока не ноль в ах jnz div_loop dig_loop: ;цикл вывода цифр в обратном порядке pop dx ;извлекаем цифру add dl,'0' ;переводим в символ mov ah, 2 int 21h ;выводим на экран loop dig_loop xor ax, ax ;ожидаем любую клавишу int 16h mov ax,4c00h int 21h code ends end start  | Консультировал: Лысков Игорь Витальевич (Старший модератор) Дата отправки: 12.04.2016, 16:09 5 нет комментария ----- Дата оценки: 12.04.2016, 16:50 | Рейтинг ответа: 0 | Консультация # 189139: Уважаемые эксперты! Пожалуйста, ответьте на вопрос: Доброго времени суток. Мне нужна ваша помощь! Суть задачи заключается в реализации знакового умножения. Задача: Даны два числа в двоичном виде(a: 10110101b; b: 00110111b). Обнулить в первом числе 3,5,6 разряды и разделить полученное на 8, второе умножить на 2 и логически сложить с первым. Результат проинвертировать. Предпочтителен TASM. Модель памяти значения не имеет. Платформа: ОС Wiondows. Уважаемые эксперты, заранее спасибо!)
Дата отправки: 09.04.2016, 10:35 Вопрос задал: nordhard (Посетитель) Всего ответов: 1 Страница онлайн-консультации » Консультирует Зенченко Константин Николаевич (Модератор): Здравствуйте, nordhard!
Смотрите приложение:
model tiny code org 100h start: mov al,10110101b;А mov bl,00110111b;В and al,10010111b;обнуляем биты младший разряд нулевой mov cl,3;число сдвигов shr al,cl;сдвигает, т.е. делим shl bl,1;сдвиггаем, т.е. умножаем or bl,al;логически суммируем mov cx,8;будем выводить 8-мь бит @@01: xor al,al;сбрасываем shl bl,1;сдвигаем в CF бит adc al,'0';переводим в символ int 29h;выводим loop @@01;в цикле ret;выход end start
Удачи!  | Консультировал: Зенченко Константин Николаевич (Модератор) Дата отправки: 12.04.2016, 08:46 5 нет комментария ----- Дата оценки: 12.04.2016, 19:52 | Рейтинг ответа: +1 |
Оценить выпуск | Задать вопрос экспертам главная страница | стать участником | получить консультацию техническая поддержка | восстановить логин/пароль Дорогой читатель! Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно! МЫ РАБОТАЕМ ДЛЯ ВАС! |
Комментариев нет:
Отправить комментарий