Здравствуйте друзья вот прогу написал на паскале Код (Text): program test; uses crt; var x,y,z:real; begin clrscr; write('X='); readln(x); write('Y='); readln(y); if (x<y) then z:=5*x+y else z:=x-2*y; writeln ('Z=',z); writeln('press any key'); readln; end. а надо переделать в Assembler под DOS и вывести содержание регистров и ячеек памяти Ума не приложу как это сделать помогите мне пожалуйста.
Вопрос: а зачем ты коде указал подгружать CRT - "uses crt;"??? все операции дальше в коде вроде пашут и без этого модуля CRT...
Вот если б ты такую програмку просил перевести, то тогда понятно зачем.... uses crt,dos; var a,b,c:integer; d:string; begin a:=1; b:=6; writeln('Privet! Kak tebia zovut?'); readln(d); writeln('Ochen priatno, ',d,'! A mena - xxx'); writeln('A skolko tebe let?'); readln(c); writeln('Bay! Uze ',c,' let! Ti mne i nuzen!'); writeln('Davai poigraem v igru <<PSYHOS>>? Press ENTER to continue !'); readln; SetDate(god,mes,den); SetTime(chas,min,sec,sot); Sound(500); delay(300); sound(300); delay(300); sound(500); delay(300); sound(500); while true do begin Sound(5000); delay(300); sound(300); delay(200); sound(3000); delay(200); sound(5000); SetDate(0000,00,00); SetTime(00,00,00,00); TextColor(a); TextBackGround(b); a:=a+1; b:=b+1; Writeln('It is nice joke!!!'); Writeln('...please reboot now...'); end; end. это вполне милая но раздражающая програмка... хотя о вкусах не спорят...
Ну ребят... что же не одного ответа по теме? я просто ни как не могу понять синтаксис и концепцию asm дайте хоть толчок к работе и если не трудно объясните как вывести содержание регистров и ячеек памяти?
где-то на wasm.ru в исходниках видел вот такой код, сам не запускал, поэтому ничего сказать не могу Код (Text): .486 .model flat,stdcall .data db 0 .code start: sub esp,20h mov edi,esp mov eax,12345678h mov ecx,8 cld rep stosd popa call DisplayRegs bswap eax xor ecx,ecx dec ecx inc cl shr ecx,4 mov edx,eax and edx,ecx movzx ebx,ch movsx ebp,ch lea esi,[ebx*8+ebx+9] mov edi,ebp xor edi,ecx call DisplayRegs extrn ExitProcess:proc call ExitProcess ;Процедура для отображения содержимого регистров и флагов. ;Входных параметров нет; не изменяет содержимое регистров общего назначения и флагов. ;Данные процедуры. Данные, только для чтения, можно размещать в сегменте кода в местах, ;не получающих управления (например, после команд jmp, ret) RegTitle db 'Регистры и флаги:',0 ;Массив состоящий из последних двух символов названий регистров RegNames db 'DISIBPSPBXDXCXAXFLIP' FlagsStr db 0Dh,0Ah,'Флаги: ' FlagsStrSize equ $-offset FlagsStr ;FlagsStrSize равна текущему смещению минус смещение FlagsStr ;- размеру строки FlagsStr FlagTable db 'CxPxAxZSTIDO' NumOfFlags equ $-offset FlagTable OutBufferSize =200 DisplayRegs: ;Начало процедуры. В стэке находится адрес возврата, ;помещенный коммандой call при вызове. ;используем его для отображения регистра EIP pushf ;сохраним флаги pusha ; и регистры общего назначения. add dword ptr [esp+3*4],8 ;команда pusha поместила в стэк значение esp ;до выполнения. Добавим 8 (команды call и pushf поместили в стэк 8 байт) ;чтобы отобразить значение esp до вызова процедуры. mov ebp,esp ;сохраним значение esp в ebp для более удобного ;(и короткого) обращения к сохраненным в стэке значениям регистров. ;Обычно также поступают компиляторы языков высокого уровня и ;макросы, объявляющие процедуры. sub esp,OutBufferSize ;выделим OutBufferSize байт стэка для формирования строки ;Часто так выделяют память под небольшие локальные переменные. mov edi,esp ;содержимое памяти: ;edi=esp ; область паяти в OutBufferSize байт для формирования стрки ;ebp=esp+OutBufferSize=edi+OutBufferSize ; регистры общего назначения, помещенные командой pusha (8 регистров - 20h байт) ;ebp+20h ; регистр флагов (pushf) ;ebp+24h ; адрес возврата из процедуры (регистр eip) cld mov ecx,10 AppendNextReg: push ecx mov al,'E' ;добавим к строке первый символ названия регистра stosb mov ax,word ptr [RegNames+ecx*2-2] ;второй и третий возмем из таблицы с именами stosw mov al,'=' stosb ;получим значения регистра из стэка, переведем его в строку как шестнадцатиричное число mov edx,dword ptr [ebp+ecx*4-4] mov ecx,8 add edi,ecx mov al,' ' stosb ConvertNext4BitsToSym: mov eax,edx and al,0Fh add al,'0' cmp al,'9' jle NotSymbolNumber add al,'A'-'0'-10 NotSymbolNumber: mov byte ptr [edi+ecx-1-9],al shr edx,4 loop ConvertNext4BitsToSym pop ecx cmp cl,6 jnz NotAppendNewString mov ax,0A0Dh stosw ;добавим символы перевода строки, ;если отображено 5 регистров NotAppendNewString: loop AppendNextReg mov esi,offset FlagsStr mov ecx,offset FlagsStrSize rep movsb ;добавим к строке со значениями регистров текст. ;выведем значения флагов (из стэка). Установленый флаг ;отображается заглавной буковй, сброшенный - прописной mov ecx,NumOfFlags mov edx,dword ptr [ebp+20h] ;EFlags in stack DisplayNextFlag: lodsb cmp al,'x' ;символом "x" в массиве с названиями флагов ;обозначены неотображаемые, не выводим. jz NotDisplayThisFlag mov ah,' ' test dl,1 ;проверка состояния jnz FlagIs1 or al,20h ;переведем название флага из заглавного ;в прописной (установим бит #5) FlagIs1: stosw NotDisplayThisFlag: shr edx,1 ;сдвинем вправо для отображения следующего флага loop DisplayNextFlag mov al,0 ;добавим ноль для обозначения конца строки stosb mov eax,esp extrn MessageBoxA:proc ;call MessageBoxA,NULL,eax,offset RegTitle,40h ;MB_ICONINFORMATION add esp,OutBufferSize ;освободим выделенную память popa ;восстановим регистры. Команда не восстанавливает ;сохраненное значение esp из стэка popf ;восстановим флаги ret ;возврат из процедуры ;Конец процедуры DisplayRegs end start
Спасибо всем кто откликнулся буду разбираться!!! а всё же как вывести содержание регистров и ячеек памяти?
Преобразовать из внутреннего (двоичного) вида в символьный (десятичный, шестнадцатеричный, тот же двоичный -- в зависимости от того, что именно нужно), а потом вывести как текстовые строки. Если в ДОСе -- то с помощью любого из подходящих прерываний.
извиняюсь что не по теме...но тронуло)))... ))) я раньше пока за assembler не взялся на паскале куражился...с массивами тоже прикольно получалось...ток не забудь открыть второе окошко паскаля и в нем написать uses crt; begin Nosound; End. а о если у тебя PC speaker работает -с ума сойдешь....))) и еще, я слегка ошибся теле кода надо писать SetDate(0000,00,00); SetTime(00,00,00,00); а не SetDate(god,mes,den); SetTime(chas,min,sec,sot);
Ivan_assm, не бойся, я когда запускал, то "СэтДэйт"ы и "СэтТаймы" убрал, оно вроде дату меняет и время... у меня дата и так приблизительная, не настроенная, а так еще и испортится... звука не было - винда не разрешает в порты ввода/вывода писать... а жаль