Czyszczenie okna terminala w asemblerze na platformie Linux

0

Witam.

Od trzech dni próbuję napisać w nasmie kod który czyści ekran. Przeglądałem syscall i znalazłem polecenie sys_execve ale to uruchamia programy lub skrypty. Myślałem  że uda mi się dzięki temu uruchomić słynne polecenie clear ale nie udało się albo źle to robiłem. Dowiedziałem się że kod ASCII escape czyści również ekran terminala. Jeśli ktoś chce przetestować to wystarczy wpisać w terminal frazę printf "\033c". Więc za pomocą wywołania sys_write wyświetlić to ale nie mogę dać znak ''. Kod programu jest prosty ale nie wiem czy on będzie tu potrzebny bo każdy kod który napisałem to zaraz kasowałem. Bardzo proszę o pomoc bo ułatwi mi to pracę dalsze nad programem oraz poszerzy moją wiedzę o nowe elementy.

Pozdrawiam

0

Jesteś pewien, ze masz dać znaki backaslash, szero, trzy, trzy?

To jest zapis JEDNEGO znaku o kodzie podanym w systemie ósemkowy, na sposób języków C-podobnych

akurat w linuxie jest ZUPEŁNIE oderwane wykonywanie wykonanie programu, użyjmy słowa "backendowego", i interpretacja kodów stdout przez terminal
Żadnego sys_execute nie potrzebujesz, skąd w ogóle ten pomysł, a potrzebujesz tylko formę zapisu znaków na stdout (nie wiem jaki to ekstrakod w asemblerze)

jesteś pewien, że musisz w asemblerze? Nie ma z tego żadnych zysków.
Nabierz poczucia pewność, ze wszystko rozumiesz o zagadnieniach, ale w C

Moim zdaniem na tym etapie płynności (fluent) w C, zerknąłem w posty, robisz sobie krzywdę asemblerem.

1
#include <unistd.h>
#include <string.h>

int main(int argc, char** argv) {
        const char* cmd = "\033c";
        write(0, cmd, strlen(cmd));
        return 0;
}

To robi to co chcesz, możesz sobie wygenerować z tego assemblera: https://godbolt.org/z/daGq9xWaf

Z tym że ty wywołasz write za pomocą int lub syscall a argusy poupychasz w rejestry.

1

Nie znam dyrektyw ani składni nasma, ale jeżeli znasz składnię gnu asemblera to możesz zmienić ten kod na nasma i powinien działać. Kod jest w asemblerze x86-64. Jeżeli plik nazwiesz clear.s to możesz ten kod zasemblować przez as -o clear.o clear.s i stworzyć wykonywalny plik elf przez ld -o clear clear.o:

.globl _start
.section .text,"ax",@progbits
.L0:
  .ascii "\33[H\33[2J"
_start:
  xorl    %eax,%eax      # rax = 0
  incl    %eax           # syscall = write
  leaq    .L0(%rip),%rsi # buf = "\33[H\33[2J"
  movl    %eax,%edi      # fd = stdout
  leal    6(%rax),%edx   # count = 7
  syscall                # write(stdout, "\33[H\33[2J", 7)
  xorl    %edi,%edi      # status = 0
  leal    60(%rdi),%eax  # syscall = exit
  syscall                # exit(0)
0

Dziękuję za każdą pomoc. Problem rozwiązany

1 użytkowników online, w tym zalogowanych: 0, gości: 1