Assembler problem z kompilacją / dodawanie w u2

0

Na wstępie chcę dodać że temat będzie poświęcony głównie dodawanie w u2 mimo wstępnego problemu opisanego dalej

  1. Witam, mam za zadanie napisać program o podanej specyfikacji
  1. Napisać program który dodaje do siebie dwie liczby całkowite w zapisane w kodzie U2.
  2. Obie liczby mają być zapamiętane jako tablice znaków ASCII, zaś zakres tych liczb ma
    obejmować przedział [–32768..32767].
  3. Liczby te muszą zostać skonwertowane z postaci znakowej do 16-bitowej postaci
    obliczeniowej w kodzie U2, a następnie dodane. Wynik, również w kodzie U2, ma z kolei
    mieć postać 32-bitową. Przekształcenie z postaci 16-bitowej do 32-bitowej powinno być
    wykonane poprzez wykorzystanie 32-bitowych rejestrów procesora (np.: EAX, EBX itd.)
  4. Po wyliczeniu wynik ma zostać skonwertowany do postaci ciągu znaków ASCII i
    wyświetlony na ekranie.
  5. Do wyświetlenia znaków można użyć funkcji: 02h (wysłanie znaku na konsolę) lub 09h
    (wysłanie na konsolę łańcucha znaków).

lecz już na starcie mam problem z napisaniem programu z użyciem rejestrów eax itp, dyrektywa ".386p" sprawia z program mimo kodu zamknięcia programu nie zamyka się, w debugerze następuje zapętlenie pewnej sekcji która nawet nie jest w kodzie ;/
załączam SS z debugera wraz z kodami

dobrze działający program
dobrze działający program

z dyrektywa .386p
z dyrektywa .386p

program typu exe który działa (dostaliśmy od prowadzących zajęcia)
```asm
.386p
.MODEL SMALL

Dane SEGMENT USE16
Napis DB "Witaj swiecie!",13,10,"$"
Dane ENDS

Kod SEGMENT USE16
ASSUME CS:Kod, DS:Dane, SS:Stosik

Start: mov ax, SEG Dane
mov ds, ax

            mov     ah, 09h         
            mov     dx, OFFSET Napis
            int     21h
			
			mov		eax, 1
			mov		ebx, 2
			add 	eax, ebx
			
			mov     ax, 4C00h
            int     21h

Kod ENDS

Stosik SEGMENT stack USE16
DB 100h DUP(0)
Stosik ENDS

			END Start
			

2.Potrafię zamienić znak na właściwą cyfrę, teorię na temat u2 (zapis) znam, wiem że muszę zwracać uwagę na najstarszy bit (określa czy liczba jest dodatnia lub ujemna), na flagi w przypadku przepełnień po wykonanej operacji itp. lecz nie wiem jak to ugryźć od strony programu

0
  1. Żeby wyjść z programu trzeba użyć sekwencji:
               mov     ax, 4C00h
               int     21h

Ty masz jakieś int 20h, które nie chce mi się teraz sprawdzać co robi, ale najwyraźniej nie wychodzi z programu.

  1. Program prowadzącego ma .386p, ale jednocześnie ma use16 przy każdym segmencie.
  2. Program prowadzącego ustawia stos, a twój nie.
0

Problem z samym szablonem mam rozwiązany, teraz chciałbym wiedzieć jak "poinformować" kompilator że chce używać liczby ze znakiem(najstarszy bit określa czy liczba jest dodatnia czy ujemna), w samym zapisie nie widzę różnicy czy używam 1bit znaku+7bit wartość czy tylko 8bit wartość, jest do tego jakaś specjalna technika czy po prostu zakłam że liczbę którą otrzymałem jest ze znakiem?
Czystą teorię o U2 posiadam lecz nie wiem od jakiej strony to ugryźć ;/
Wiem że zadaję głupie pytania ale to jest niestety myślenie wysokopoziomowe(wszystko gotowe) ;/

Wynik, również w kodzie U2, ma z koleimieć postać 32-bitową. Przekształcenie z postaci 16-bitowej do 32-bitowej powinno być wykonane poprzez wykorzystanie 32-bitowych rejestrów procesora (np.: EAX, EBX itd.)

nie wiem jak to mam zrozumieć ;/

0

Pisząc w asemblerze to ty decydujesz czy liczba jest traktowana jako liczba ze znakiem lub bez poprzez wykonywanie odpowiednich operacji na niej. Kompilator (asembler) nie ma w ogóle świadomości typów jakie trzymasz w rejestrach.

0

Nie „informuje się” czy w rejestrze jest liczba ze znakiem czy bez, tylko używa odpowiednich instrukcji do operowania na liczbach.

Dodawanie i odejmowanie wykonuje się tak samo, za pomocą inc, dec, add i sub.
Mnożenie i dzielenie wykonuje się za pomocą mul i div dla liczb bez znaku, a imul i idiv dla liczb ze znakiem.
Porównywanie robi się za pomocą cmp, ale potem używa się innych skoków: je, jne, ja, jb dla liczb bez znaku, je, jne, jg i jl dla liczb ze znakiem.

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