Assembler w C - dokonczenie programu

0

Witajcie, mam taki program jak poniżej w C ze wstawką Assembler. W miejsce [...] muszę dopisać kod który doda 12 + 32 i wyświetli wartość 44, zakładamy że dodajmey tylko liczby 2 cyfrowe. Może ktoś podpowiedzieć jak się do tego zabrać ? zaczynam zabawę z assemblerem dopiero i za każde pomoce serdecznie dziękuję :-)

#include <stdio.h> 
int main() { 
   char *x = "12"; 
   char *y = "32"; 
   char bufor[4]; 
    
   asm volatile( 
      ".intel_syntax noprefix;" 
      "mov ebx,%0;" 
      "push ebx;" 
      "mov ebx,%1;" 
      "mov eax,%2;" 
      "call zadanie1;" 
      "jmp wyjscie;" 
      "zadanie1:" 
       
      [...] 
      "wyjscie:" 
      ".att_syntax prefix;" 
      : 
      : "r" (x), "r" (y), "r" (bufor) 
      : "eax", "ebx" 
    
   ); 
   return 0; 
}
0

Masz dodać 12 do 32 czy liczby zapisane pod zmiennymi x oraz y?
Bo jeżeli to pierwsze, to wystarczy:

mov eax, 12
add eax, 32

:P

0

Dodać wartości, które są po zmiennymi x i y.
Problem w tym ze sa one w typie char i nie mam pojęcia jak się za to zabrac.

2

12 = 1*10^1 + 2*10^0
123 = 1*10^2 + 2*10^1 + 3*10^0

123%10=3, 123/10=12

To powinno Ci trochę nasunąć myśl.
Zacznij od zastanowienia się, jak wykonałbyś to C.

0
 #include <stdlib.h>
 #include <stdio.h>
 int main(int argc, char* argv[]) {
     char x = '12';
     char y = '32';
     int v = (x - '0') - (y - '0');
     printf("%d\n", v);

     return 0;
 }

W takie cos bym zrobil, ale to nie jest do konca to co wyżej. A więcej pomyslow nie mam.
odnośnie twojej podpowiedzi to mam dodawać cyfre jednosci do cyfry jednosci a cyfre dziesiatek do cyfry dziesiacek ?
pozdrawiam

0
123%10 = 3 <-
123/10 = 12

12%10 = 2 <-
12/10 = 1

1%10 = 1 <-
1/10 = 0

Widzisz jakiś schemat tutaj może?

0

Tak, widzę że robiąc %10 otrzymam liczbę jedności, a /10 otrzymam liczbę dziesiątek zgadza się ?
I w związku z tym mogę zsumować te cyfry jedności liczby x z cyframi jedności liczby y, i dziesiątek x'a z dziesiątkami y ?

0

Możesz także napisać funkcję do zamiany ciągu znaków na liczbę i wykonać zwykłe add - wtedy nie będziesz się musiał martwić o przesunięcia czy długości liczb.

Edit: nie doczytałem, że chodzi tylko o dwucyfrowe. Wtedy tak, dobrze myślisz. Nie zapomnij jednak o przesunięciu, jeżeli np. będzie 39+39

0

Tak liczby tylko dwucyfrowe, lecz jak z chara zrobić liczbę int ? To mnie zastanawia i nie wiem jak z tego wybrnąć, wyświetlić tekst w assemblerze już się nauczyłem, ale z tym dodawaniem na char nie mam pojęcia. Gdyby liczby w int były to użyłbym add i po sprawie, ale w zadaniu jest utrudnienie i char *x (wskaznik do x), a wskazniki nie sa moja mocna strona.
Pozdrawiam serdecznie i dziekuje za wszyskie rady.

0

Poratuje ktoś pomocną dłonią ?

0

Spróbuj rzutowania na chama.

0

@Krawawy Krwawiec:
Napisałem Ci już podpowiedź:
123 = 1*10^2 + 2*10^1 + 3*10^0 :P

@Michał Sz.: możesz wytłumaczyć, w jaki sposób to miałoby działać?

0

Po rzutowaniu będzie miał operacje na intach, co tu tłumaczyć?

0

Tylko, jako, że to są stringi, trzeba by to chyba robić jako pojedyńcze elementy tablicy, o ile się da. Chyba, że stringa też można na inta rzutować.

0

Po rzutowaniu będzie miał operacje na intach, co tu tłumaczyć?

Po rzutowaniu to otrzyma on liczbę będącą adresem pierwszej cyfry...

0

Umiałbyś to zrobić w C? Jeśli tak, dokładnie tak samo możesz spróbować w asm.

Bardzo rozpisana wersja:

// dane: char *x = "12", *y = "32";
int x_fst_digit = (x[0] - '0'); // pierwsza cyfra x 
int x_snd_digit = (x[1] - '0'); // druga cyfra x 
int y_fst_digit = (y[0] - '0'); // pierwsza cyfra y
int y_snd_digit = (y[1] - '0'); // druga cyfra y
int x_value = x_fst_digit * 10 + x_snd_digit; // x zmieniony na liczbę (z napisu)
int y_value = y_fst_digit * 10 + y_snd_digit; // y zmieniony na liczbę (z napisu)
int result = x_value + y_value; // wynik dodawania
int result_fst_digit = result / 10; // pierwsza cyfra wyniku
int result_snd_digit = result % 10; // druga cyfra wyniku
// wypisz result_fst_digit, result_snd_digit na ekran

W asm dokładnie tak samo, tylko składnia trochę inna (nawet tyle samo linijek wyjdzie jeśli się postarasz).

0

Od siebie dodam jeszcze literaturę, w której są dość jasno opisane operacje na stringach w assemblerze.
Professional Assembly Language, Richarda Blum'a , Rozdział 10.

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