mirror of
https://github.com/tsoding/good_training_language.git
synced 2026-09-12 19:50:53 +05:00
Ввести инструкция «Обменять» и исправить интринсик «адрес»
This commit is contained in:
parent
19cb622366
commit
1aa08f76e5
@ -188,6 +188,14 @@ pub fn интерпретировать(пп: &ПП, имена: &Имена, т
|
||||
машина.протолкнуть_значение(значение)?;
|
||||
машина.индекс_инструкции += 1;
|
||||
}
|
||||
&ВидИнструкции::Обменять => {
|
||||
машина.проверить_арность_аргументов(2)?;
|
||||
let первое = машина.вытолкнуть_значение()?;
|
||||
let второе = машина.вытолкнуть_значение()?;
|
||||
машина.протолкнуть_значение(первое)?;
|
||||
машина.протолкнуть_значение(второе)?;
|
||||
машина.индекс_инструкции += 1;
|
||||
}
|
||||
&ВидИнструкции::Вытолкнуть(количество) => {
|
||||
машина.проверить_арность_аргументов(количество)?;
|
||||
машина.стек += РАЗМЕР_СЛОВА*количество;
|
||||
|
||||
@ -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)
|
||||
}
|
||||
|
||||
@ -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");
|
||||
|
||||
@ -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..количество {
|
||||
|
||||
@ -1,10 +1,11 @@
|
||||
вкл прелюдия;
|
||||
|
||||
про тест(а: цел, б: цел) то печать(а + б, «\н»);
|
||||
про тест_передачи_аргументов_функции(а: цел, б: цел) то
|
||||
печать(«Передача аргументов функции: », а + б, «\н»);
|
||||
|
||||
про главная() нч
|
||||
печать(«Печать чисел: », 0, «, », 69, «, », 1234567890, «\н»);
|
||||
печать(«Печать чисел: », 0, «, », 69, «, », 1234567890, «\н»);
|
||||
печать(«Печать логических: », 69 == 69, «, », 69 == 420, «\н»);
|
||||
печать(«----------\н»);
|
||||
тест(34, 35);
|
||||
печать(«Адрес строки: », адрес(«привет»), «\н»);
|
||||
тест_передачи_аргументов_функции(34, 35);
|
||||
кц
|
||||
|
||||
Loading…
Reference in New Issue
Block a user