Ввести инструкция «Обменять» и исправить интринсик «адрес»

This commit is contained in:
rexim 2024-01-22 18:24:00 +07:00
parent 19cb622366
commit 1aa08f76e5
5 changed files with 27 additions and 4 deletions

View File

@ -188,6 +188,14 @@ pub fn интерпретировать(пп: &ПП, имена: &Имена, т
машина.протолкнуть_значение(значение)?;
машина.индекс_инструкции += 1;
}
&ВидИнструкции::Обменять => {
машина.проверить_арность_аргументов(2)?;
let первое = машина.вытолкнуть_значение()?;
let второе = машина.вытолкнуть_значение()?;
машина.протолкнуть_значение(первое)?;
машина.протолкнуть_значение(второе)?;
машина.индекс_инструкции += 1;
}
&ВидИнструкции::Вытолкнуть(количество) => {
машина.проверить_арность_аргументов(количество)?;
машина.стек += РАЗМЕР_СЛОВА*количество;

View File

@ -21,6 +21,7 @@ pub enum ВидИнструкции {
/// интерпретации, либо генерации машинного кода.
ПротолкнутьУказатель(usize), // СДЕЛАТЬ: по возможности, использовать u64 вместо usize для значений пп
Вытолкнуть(usize),
Обменять,
СохранитьКадр,
ВосстановитьКадр,
// СДЕЛАТЬ: смещение чтения и записи кадра очень странные. Нужно их поправить так, чтобы они имели больше смысла.
@ -485,6 +486,7 @@ fn скомпилировать_выражение(пп: &mut ПП, имена:
let тип_среза = скомпилировать_выражение(пп, имена, параметры, &срез)?;
match тип_среза {
Тип::Строка => {
пп.код.push(Инструкция{ вид: ВидИнструкции::Обменять, лок: имя.лок.clone()});
пп.код.push(Инструкция{ вид: ВидИнструкции::Вытолкнуть(1), лок: имя.лок.clone()});
Ok(Тип::Цел64)
}

View File

@ -42,6 +42,12 @@ pub fn сгенерировать_исполняемый_файл(путь_к_и
let _ = writeln!(&mut файл, " pop rax");
}
}
ВидИнструкции::Обменять => {
let _ = writeln!(&mut файл, " pop rax");
let _ = writeln!(&mut файл, " pop rbx");
let _ = writeln!(&mut файл, " push rax");
let _ = writeln!(&mut файл, " push rbx");
}
ВидИнструкции::СохранитьКадр => {
let _ = writeln!(&mut файл, " push rbp");
let _ = writeln!(&mut файл, " mov rbp, rsp");

View File

@ -98,6 +98,12 @@ pub fn сгенерировать_исполняемый_файл(путь_к_ф
адрес_операнда_указателя,
});
}
&ВидИнструкции::Обменять => {
код.extend([0x58]); // pop rax
код.extend([0x5B]); // pop rbx
код.extend([0x50]); // push rax
код.extend([0x53]); // push rbx
}
&ВидИнструкции::Вытолкнуть(количество) => {
// СДЕЛАТЬ: можеть быть стоит напрямую модифицировать регистр rsp одной операцией?
for _ in 0..количество {

View File

@ -1,10 +1,11 @@
вкл прелюдия;
про тест(а: цел, б: цел) то печать(а + б, «\н»);
про тест_передачи_аргументов_функции(а: цел, б: цел) то
печать(«Передача аргументов функции: », а + б, «\н»);
про главная() нч
печать(«Печать чисел: », 0, «, », 69, «, », 1234567890, «\н»);
печать(«Печать чисел: », 0, «, », 69, «, », 1234567890, «\н»);
печать(«Печать логических: », 69 == 69, «, », 69 == 420, «\н»);
печать(«----------\н»);
тест(34, 35);
печать(«Адрес строки: », адрес(«привет»), «\н»);
тест_передачи_аргументов_функции(34, 35);
кц