У меня они в 2 разных сегментах. Как между ними правильную связь сделать?
es
если бы использовалась инструкция stosb
, но в этом коде этого не происходит. да, действительно запустил clang 1.c && ./a.out
и код из примера с гайда заработал корректно.
gcc 1.c && ./a.out
-- у вас реально работает по-другому? 1. Как ее сделать исполняемой? Я настроил сегмент так же, как "родной" сегмент. Поставил галочки на read, write, задал те же регистры в assume. При том при дебаге видно, что шаг на мою функцию доходит, но функция вызова становится пустой (db 0).
2. Не знаю как сделать возврат
В Linux - диски монтируются в систему.
Круглые скобки работают внутри [[ ]], но не работают внутри [ ].
if [ \( "$projectDir" = "video" -o "$projectDir" = "audio" \) -a "$flag" != "noflag" ]
if [ '(' "$projectDir" = "video" -o "$projectDir" = "audio" ')' -a "$flag" != "noflag" ]
-d in_asm,exec,cpu -D logfile
) и посмотри, что происходит. как это можно решить?
dividing_by_zero
, восстановит все регистры и сделает iret
. я думал это решит проблему, но не помогло(
dividing_by_zero
. Код надо перестроить, твой Makefile с этим не очень хорошо справляется.dividing_by_zero
не удаётся вернуться -- это уже другая проблема. iret
из середины с++-функции, потому что компилятор организовал в ней кадр стека и вместо возврата iret
снимает и интерпретирует мусор из этого кадра:001000e6 <SimpleOS::IDT::dividing_by_zero()>:
1000e6: 55 push %ebp
1000e7: 89 e5 mov %esp,%ebp
1000e9: 53 push %ebx
1000ea: 83 ec 04 sub $0x4,%esp
1000ed: e8 15 01 00 00 call 100207 <__x86.get_pc_thunk.ax>
1000f2: 05 06 11 00 00 add $0x1106,%eax
1000f7: 83 ec 0c sub $0xc,%esp
1000fa: 8d 90 08 fe ff ff lea -0x1f8(%eax),%edx
100100: 52 push %edx
100101: 89 c3 mov %eax,%ebx
100103: e8 4c 00 00 00 call 100154 <SimpleOS::Terminal::print(char const*)>
100108: 83 c4 10 add $0x10,%esp
10010b: fa cli
10010c: cf iret
10010d: 90 nop
10010e: 8b 5d fc mov -0x4(%ebp),%ebx
100111: c9 leave
100112: c3 ret
struct IDTPtr {
uint16_t limit;
uint32_t base;
};
packed
, иначе компилятор вставляет паддинг для выравнивания поля base
на границу uint32_t
, из-за чего в IDT загружается неверный адрес.
Dyikot, они всегда там, но разное их число оцифруется без искажений. Смотри:
если ты дискретизируешь на 8КГц, то при частоте 100Гц гармоники вплоть до 39й воспринимаются АЦП нормально. 39я гармоника вносит вклад в ~2.5% относительно основного сигнала. А если сигнал 2КГц -- то уже третья гармоника будет алиаситься если её не отфильтровать. Вклад третьей гармоники -- 33% от основного сигнала.