diff --git a/01-asm-basics/main.c b/01-asm-basics/main.c index 6abbced..a9c8a66 100644 --- a/01-asm-basics/main.c +++ b/01-asm-basics/main.c @@ -46,12 +46,21 @@ int main(void) { set_input_mode(); while (isKeyPressed() == 0) { - asm { - push ax - in al,0x40 - } - unsigned char Tmm = _AL; - asm pop ax +// asm { +// push ax +// in al,0x40 +// } + + unsigned char Tmm = 0; + asm ( + "push rax\n\t" + "in al, 0x40" + "mov %0, al" + "pop rax" + :"=r"(Tmm) + : + :"rax" + ); delay(500); printf("\n Порт40 = %d", Tmm); } @@ -69,46 +78,58 @@ int main(void) { reset_input_mode(); system("pause"); - int Time; - set_input_mode(); - while (isKeyPressed() == 0) { - asm push ds - asm push si - asm mov ax, 40h - asm mov ds, ax - asm mov si, 0x6C - asm mov ax, [ds : si] - asm mov Time, ax - asm pop si - asm pop ds + // Данная секция закомментирована, поскльку линукс не дает обратиться к + // не промапанной и не аллоцированной памяти. Но даже если ее аллоцировать + // mmem'ом, все равно эта память будет виртуальная, поэтому смысла делать + // это не имеет. Вариант просмотра содержимого условной ячейки памяти на nasm + // приведен в файле time.asm. Объяснить тот код, который я вижу + // на базовом уровне я в состоянии - printf("\n %d", Time); - delay(300); - } - reset_input_mode(); +// int Time; +// set_input_mode(); +// while (isKeyPressed() == 0) { +// Здесь происходит операция получения времени суток при +// помощи обращения к специально размеченой области памяти +// Однако можно ли такой фокус сделать в linux это еще надо узнать +// asm push ds +// asm push si +// asm mov ax, 40h +// asm mov ds, ax +// asm mov si, 0x6C +// asm mov ax, [ds : si] +// asm mov Time, ax +// asm pop si +// asm pop ds +// asm( +// "mov " +// ); +// +// printf("\n %d", Time); +// delay(300); +// } +// reset_input_mode(); +// +// beep(400, 200); +// for (lCnt = 0; lCnt < 1000000; lCnt++) { +// a1: +// asm { +// mov ax,iA +// mov ax,iA +// mov ax,iA +// mov ax,iA +// mov ax,iA +// mov ax,iA +// mov ax,iA +// mov ax,iA +// mov ax,iA +// a2: +// mov ax,iA +// } +// } +// beep(400, 200); - beep(400, 200); - for (lCnt = 0; lCnt < 1000000; lCnt++) { - a1: - asm { - mov ax,iA - mov ax,iA - mov ax,iA - mov ax,iA - mov ax,iA - mov ax,iA - mov ax,iA - mov ax,iA - mov ax,iA - a2: - mov ax,iA - } - } - beep(400, 200); + // здесь секция для выполнения замеров времени. Поскольку доступ к звуку + // Я иметь не могу, если не буду использовать pulseaudio, замерим старыми дедовскими методами + // При помощи clock_gettime } -//void beep(unsigned iTone, unsigned iDlit) { -// sound(iTone); -// delay(iDlit); -// nosound(); -//} diff --git a/01-asm-basics/substitutions.c b/01-asm-basics/substitutions.c index d6cb262..6f137f1 100644 --- a/01-asm-basics/substitutions.c +++ b/01-asm-basics/substitutions.c @@ -3,6 +3,7 @@ #include #include #include +#include /* Use this variable to remember original terminal attributes. */ @@ -32,7 +33,8 @@ void set_input_mode() /* Set the funny terminal modes. */ tcgetattr (STDIN_FILENO, &tattr); tattr.c_lflag &= ~(ICANON|ECHO); /* Clear ICANON and ECHO. */ - tattr.c_cc[VMIN] = 1; + tattr.c_cc[VMIN] = 0; + tattr.c_cc[VTIME] = 0; tcsetattr (STDIN_FILENO, TCSAFLUSH, &tattr); } @@ -52,10 +54,10 @@ char isKeyPressed() return 0; } -//int main() -//{ -// set_input_mode(); -// while (isKeyPressed() == 0) {} -// printf("ok"); -// reset_input_mode(); -//} +int main() +{ + set_input_mode(); + while (isKeyPressed() == 0) {printf("hell\n");} + printf("ok\n"); + reset_input_mode(); +}