Не особо силен в ASM. Только изучаю, подскажите как вот это сделать ... Как ПРАВИЛЬНО ! Записать функцию int sm=((((y-1)*40)+x)*2)-2; на x86 ASM ? Исходные данные: 40 константа al; x ah; y di; результат ?
Andrei, сперва покажи, ЧТО сделал САМ, дальше поможем вычитание команда SUB сложение команда ADD умножение команда MUL поместить команда MOV
Code (C): void sm () { asm { mov ah,y // Записываем у в ah mov ax,ah // Записываем у в ax sub ax,1 // Вычитаем 1 mov ch,ax // Переносим в ch mov al,40 // Записываем константу mul ch // Умножаем //add ax,2 // add ax,x //Прибавляем x mov ch,ax // Переносим в ch mov al,2 // заносим константу в al mul ch // умножаем sub ax,2 // вычитаем 2 mov di,ax // сохраняем результат в di } }
Нужно ли при этом регистры в стеке сохранять ? push pop Делать ? И какие регистры нужно сохранять обязательно ?
Andrei, ((y-1)*40+x)*2-2=80y+2x-82 Code (ASM): mov al,80 mul y; ax=80*y sub ax,82 mov bh,0 mov bl,x add bx,bx; bx=x*2 add ax,bx; ax=((y-1)*40+x)*2-2 mov di,ax
Держи. Вот так правильно по условию. Code (ASM): mov al, 7 ; Init X = 7 mov ah, 19 ; Init Y = 19 movzx di, ah ; di = y dec di ; di = (y-1) imul di, di, 40 ; di = (y-1)*40 and ax, 0FFh ; ax = al = x () add di, ax ; di = ((y-1)*40)+x shl di, 1 ; di = (((y-1)*40)+x)*2 sub di, 2 ; di = ((((y-1)*40)+x)*2)-2 P.S. А вообще, я бы не стал использовать для этого 8- и 16-битные регистры. Вполне приемлемы и 32, если софтина не досовская. Не факт что нужна такая оптимизация. Скорее всего это кусок лабы. Преподы спецом могут такие задачи ставить, хотя такой вариант и правильнее. P.S.: код может быть оптимизирован еще лучше.
Насчет раскрытия скобок, и упрощения может быть и сработает, попробую, ... В любом случае, я понял как решаются подобные вещи )
Коцит, судя по комментариям ― это вставка в Си, то есть, вряд ли C под DOS, да и топик я перенес из Win32, так что скорее всего это 386+
Коцит, можно, то оно можно, только вот Turbo C ver 3.2 не поймет, хотя, можно и в машинных кодах (через db), только это преподаватель не оценит
А не подскажите какую IDE ASM под win (dos) лучше неопытному использовать, ну там masm, tasm и.т.д Я вот допустим хочу написать код чтобы светодиод scroll на клавиатуре начал мигать, секунду горит секунду не горит ...
Определись сначала с языком masm/tasm. Я, например, предпочитаю MASM и Notepad++, IDE, как правило, сильно тормозные. Компилить и батниками можно, а отлаживать при помощи OllyDbg. Однажды батники мне надоели и я написал для компиляции проектов плагин для Notepad++. Вообщем я предпочитаю не среды разработки, а блокнот. Это вполне нормальная простенькая задача для новичка. Имитируй нажатие на клавишу и все
Ok, а кроме имитации нажатия клавиши есть варианты ? Например запись по адресу регистра бита включения светодиода ? Ведь есть же где то в памяти регистр хранения вкл выкл светодиода (1 или 0) ???
Andrei, если писать под Windows, то можно использовать WinAPI, которое будет включать/выключать лампочки на клавиатуре (например keybd_event) или написать драйвер, который даст доступ на запись байта в порт 60h, младшие три бита этого байта будут определять состояние светодиодов на клавиатуре, но для начала определись ― под какую систему будешь писать (DOS/Win32/Win64)?