Asembler

Komputer wraz z oprogramowaniem wspomagającym projektowanie stał się częścią życia elektronika.
mariuszxxx6
Raczkujący użytkownik 2
Raczkujący użytkownik 2
Posty: 11
Rejestracja: czw 20 paź 2005, 20:50

Asembler

Postautor: mariuszxxx6 » wt 22 lis 2005, 21:46

Witam!
Mam mały problem z zamianą liczb dziesiętnych na kod U2.. może ktoś mi poda jakieś wskazówki jak to ma wyglądać. Byłbym wdzięczny, pozdrawiam

movzx
Aktywny użytkownik 3
Aktywny użytkownik 3
Posty: 642
Rejestracja: ndz 07 sie 2005, 23:38
Lokalizacja: Wrocław
Kontaktowanie:

Postautor: movzx » śr 23 lis 2005, 1:10

1. Zamieniasz modul liczby dziesietnej na binarna
2. Jesli dziesietna byla ujemna (dodatnia w U2 jest taka sama jak w NBC) to obliczasz liczbe przeciwna do uzyskanej:
a) negujesz wszystkie bity
b) dodajesz 1 wedlug schematu:
1+0=1
0+1=1
1+1=10

Dokladnie jest to opisane chociazby na Wikipedii
http://pl.wikipedia.org/wiki/Kod_uzupe% ... dw%C3%B3ch
Pozdr.

mariuszxxx6
Raczkujący użytkownik 2
Raczkujący użytkownik 2
Posty: 11
Rejestracja: czw 20 paź 2005, 20:50

Postautor: mariuszxxx6 » śr 23 lis 2005, 3:19

ehh troche źle się wyraziłem, chodziło mi o to jak ma to wyglądać pod Asemblerem? I mam jeszcze jedno pytanie a mianowicie:
Dany jest kod naturalny ośmiobitowej liczby całkowitej : 10011101.
Przedstawić tę liczbę w postaci znakowej (kod ASCII) jako liczbę szesnastkową wiedząc, że kod ASCII znaku "A" wynosi 41h, a cyfry 0 odpowiednio 30h :
kod ASCII starszej cyfry :
Kod ASCII srodkowej cyfry :
kod ASCII młodszej cyfry :

Czy wie ktoś może jak to zrobić, chciałbym się tego nauczyć ale nie wiem zabardzo od tego zacząć (będe miał podobne przykłady na zaliczeniu). Jednym słowem nie umiem się za to zabrać.Czy ktoś mógłby mi pomóć??

movzx
Aktywny użytkownik 3
Aktywny użytkownik 3
Posty: 642
Rejestracja: ndz 07 sie 2005, 23:38
Lokalizacja: Wrocław
Kontaktowanie:

Postautor: movzx » śr 23 lis 2005, 12:25

Ja uczylem sie asma na podstawie materialow z sieci... Wpisanie w google "kurs assembler" daje az za duzo wynikow ;)
Do tego polecam spis komend i opis architektury x86 - w zalaczniku.
Pozdr.

PS: W drugim zadaniu:
Podzielic liczbe na 2 czesci po 4 bity:
(zakladajac ze liczbe mamy w AL):

mov ah,al
and al,0Fh
and ah,F0h
shr ah,4

Nastepnie dla kazdej z czesci nalezy:
sprawdzic czy jest wieksza od 9. Jesli nie, nalezy dodac do niej 0x30. Jesli tak, nalezy dodac do niej 0x37 (0x41-0x0A)
I tyle :)
Załączniki
INTEL.TXT
Dokumentacja Intel x86
(112.01 KiB) Pobrany 1624 razy

mariuszxxx6
Raczkujący użytkownik 2
Raczkujący użytkownik 2
Posty: 11
Rejestracja: czw 20 paź 2005, 20:50

Postautor: mariuszxxx6 » śr 23 lis 2005, 13:07

Aha. To jeśli chodzi o to drugie zadanie to kodu ASCII będzie wynosił 9Eh???
starsza cyfra to są te bity leżące na ostatnich 4 pozycjach czyli E ?? a młodsze na pierwszych 4 bitach czyli 9??

mariuszxxx6
Raczkujący użytkownik 2
Raczkujący użytkownik 2
Posty: 11
Rejestracja: czw 20 paź 2005, 20:50

Postautor: mariuszxxx6 » śr 23 lis 2005, 13:09

sorka poymyliłem (błąd w liczeniu :) ) zamiast E powinno być D

movzx
Aktywny użytkownik 3
Aktywny użytkownik 3
Posty: 642
Rejestracja: ndz 07 sie 2005, 23:38
Lokalizacja: Wrocław
Kontaktowanie:

Postautor: movzx » śr 23 lis 2005, 13:16

Starsza pozycja = bardziej znaczaca.
Proponuje zaczac od powtorki podstaw systemow liczbowych, konwersji i operacji aryt-log. Bo bez tego asm jest *bardzo* trudny :(
I nie "kod ascii" tylko 2 znaki ascii: "9" czyli 0x39 i "D" czyli 0x44.
Pozdr.

mariuszxxx6
Raczkujący użytkownik 2
Raczkujący użytkownik 2
Posty: 11
Rejestracja: czw 20 paź 2005, 20:50

Postautor: mariuszxxx6 » śr 23 lis 2005, 14:55

Wiesz ja kod Ascii miałem dopiero w niedziele a egzam zerówkowy mam w tą niedziele co będzie, a bardzo mi zależy na zaliczenie tego egzamu zeby mieć mniej na sesje.Mam duże kłopoty z kodem Ascii a konkretnie z tego typu przykładem, nie bardzo wiem o co chodzi w tym zadaniu.
Dany jest kod naturalny ośmiobitowej liczby całkowitej : 10011101.
Przedstawić tę liczbę w postaci znakowej (kod ASCII) jako liczbę szesnastkową wiedząc, że kod ASCII znaku "A" wynosi 41h, a cyfry 0 odpowiednio 30h :
kod ASCII starszej cyfry :
kod ASCII młodszej cyfry :

Bede najprawdopodobniej miał podobne zadania do rozwiązania na kartce papieru a nie pod Asem. Więc powiedz mi czy dobrze kompinuje.
Dziele tą liczbe na dwie częsci, wiem juz ze bit najstarszy (najbardziej znaczący) jest to pierwszy bit. Czy rozwiązanie tego zadania będzie wyglądać w ten sposób:

kod ASCII starszej cyfry: 9
kod ASCII młodszej cyfry: D
kurde no nie rozumiem:(

movzx
Aktywny użytkownik 3
Aktywny użytkownik 3
Posty: 642
Rejestracja: ndz 07 sie 2005, 23:38
Lokalizacja: Wrocław
Kontaktowanie:

Postautor: movzx » śr 23 lis 2005, 15:58

Jesli dobrze rozumiem zadanie to tak wlasnie trzeba to zrobic.
Pozdr.

mariuszxxx6
Raczkujący użytkownik 2
Raczkujący użytkownik 2
Posty: 11
Rejestracja: czw 20 paź 2005, 20:50

Postautor: mariuszxxx6 » czw 24 lis 2005, 15:58

a mógłbyś mi jeszcze w czymś pomóc?
Mialem do zrobienia program ktory miał czytać licze w postaci znakowej i konwertować ją do postaci obliczeniowej (pobiera od uzytkownika liczbe, patrzy czy jest z danego przedziału ma przerobić na U2 a potem skonwertować do kodu Ascii , musi jednak zabezpieczać przed wypisywaniem innych znaków niż cyfra ).
i Napisałem coś takiego ale to nie działa tak jakbym chciał:
MODEL SMALL

zakres EQU [-32768,32768]

dane SEGMENT
tekst DB "Podaj liczbe i nacisnij enter :",'$'
uwaga DB "Blad!! To nie jest cyfra.",'$'
uwaga2 DB "Blad!! Przekroczyles zakres.",'$'
cyfra DW ?,'$'
minus DB 0,'$'
nowa_linia DB 13,10,'$'
binarnie db 17 dup ('0'), '$'
dane ENDS

kod SEGMENT

ASSUME CS:kod, DS:dane, SS:stosik

start:
push SEG dane
pop ds

mov si, OFFSET binarnie



;!!!!wczytanie liczby dziesiętnej!!!!

wczyt:
push bx
push cx

mov bx, 10 ;podstawa dziesiętna

wczytaj_znak:

push ax ;wrzucamy ax na stos
mov ah, 01h ;wczytywanie znaku z echem
int 21h
cmp al, 13 ;enter czyli przejœcie do obliczeń
je wczytana
cmp al, '-' ;porównanie czy ujemna
je znak
cmp al, '0' ;porównania czy to cyfra a nie jakiœ znak
jb blad
cmp al, '9'
ja blad


mov cl, al ;wrzucamy kod znaku do cl
sub cl, '0' ;zamiana na ascii
pop ax ;zdejmujemy ax ze stosu
mul bx ;dotychczasowa razy 10
add ax, cx ;powiększenie naszej liczby o wczytanš
jmp wczytaj_znak



blad: ;jeœli użytkownik wpisał nie liczbę ale jakiœ znak

mov ah, 09h
mov dx, OFFSET nowa_linia
int 21h

mov ah, 09h ;to po sprawdzeniu wyskakuje ten błšd
mov dx, OFFSET uwaga
int 21h

mov ax, 4C00h
int 21h

blad2: ;jeœli użytkownik przekroczył zakres

mov ah, 09h
mov dx, OFFSET nowa_linia
int 21h

mov ah, 09h
mov dx, OFFSET uwaga2
int 21h

mov ax, 4C00h
int 21h

znak: ;sprawdza czy pierwszy znak to minus '-'
cmp minus, '-' ;jeœli w zmiennej minus jest już znak t wyskakuje błšd
je blad
mov minus, al ;jeœli nie ma to wpisuje go do zmiennej minus
mov ax, 0 ;zerowanie ax
jmp wczytaj_znak

wczytana:
pop ax ;zdjęcie ze stosu
pop cx
pop bx

spr_zakres:

cmp ax, zakres ;sprawdzenie zakresu aby można było zapisać liczbę dwójkowo
jae blad2 ;w 16 bitach


;!!!!konwersja na system dwójkowy!!!!

push ax
mov cx, 16 ;petla bedzie powtarzana 16 razy
mov di, 2 ;dzielenie przez di
mov bx, 16 ;bx wskazuje na ostatni element

zamiana: ;petla zamiany kolejnych cyfr
mov dx, 0
div di ;wynik w ax, reszta w dx
add dl, '0' ;zamiana na ASCII
mov binarnie[bx], dl ;na koniec tablicy dodajemy kolejna cyfre
dec bx ;wskazuje na starsza cyfre
loop zamiana
pop ax

;!!!!konwersja na U2!!!!

u2:
cmp minus, '-' ;sprawdzamy jeœli jest minus to skaczemy do ujemna
je ujemna ;0 jest w zainicjowanej tabliczy
jne koniec

ujemna:
mov binarnie[0], '1' ;jak jest to dopisujemy 1




koniec:


mov ah, 09h
mov dx, OFFSET nowa_linia
int 21h

mov ah, 09h
mov dx, OFFSET binarnie
int 21h

mov ax, 4c00h
int 21h




kod ENDS

stosik SEGMENT STACK

DB 100h dup (?)

stosik ENDS

END start


Moze Wiesz w czym tkwi błąd??

movzx
Aktywny użytkownik 3
Aktywny użytkownik 3
Posty: 642
Rejestracja: ndz 07 sie 2005, 23:38
Lokalizacja: Wrocław
Kontaktowanie:

Postautor: movzx » czw 24 lis 2005, 21:38

Ech... Straszne zamieszanie w tym programie...
Mam propozycje: Napisz to jeszcze raz uwzgledniajac pare rzeczy:

1) Zglaszanie bledow czy tez ogolnie komunikacje z uzytkownikiem powierz osobnym procedurom (call - ret) np. na koncu programu. Bedzie 100x przejrzysciej i latwiej do debugowania.
Ogolnie w glownym programie powinno byc jak najwiecej wywolan procedur i jak najmniej gmatwaniny.

Wtedy dokladnie widac przebieg tego co program robi.

2) Nie wiem co oznacza "push SEG dane" ale moj assembler nie rozumie tego... (Jesli chodzi o ustawienie rejestrow segmentowych to kazdy przyzwoity asm powinien to robic juz kiedy zobaczy Assume)
3) Nie rozumie rowniez zmiennej "zakres". Przerobilem to w prosty sposob na zakres_dol i zakres_gora i 2 porownania - dziala
4) *NIE* uzywaj polskich znakow w kodzie. Assembler to nie podanie o prace.

Bedziesz mial ladniejszy kod i debugowac sie go bedzie latwiej i pewnie ocena tez bedzie wyzsza :)
Pozdr.

mariuszxxx6
Raczkujący użytkownik 2
Raczkujący użytkownik 2
Posty: 11
Rejestracja: czw 20 paź 2005, 20:50

Postautor: mariuszxxx6 » pt 25 lis 2005, 1:01

oki dostosuje sie do Twoich rad ale zrobie to dopiero wtedy gdy naucze sie na koło z fizy i kodu Asccii i U2 :) P.S. Dzieki za chwilowo poświecony czas, ale ja tu jeszcze wróce.Pozdrawiam

mariuszxxx6
Raczkujący użytkownik 2
Raczkujący użytkownik 2
Posty: 11
Rejestracja: czw 20 paź 2005, 20:50

Postautor: mariuszxxx6 » sob 26 lis 2005, 1:36

Movzx please help me!! :)
Mam 3 pytania do Ciebie :)
1. Czym sie różni dodawanie liczb w kodzie U2 od dodawania kodzie naturalnym??
2.Mam takowe zadanie i nie bardzo je kumam (jak zwykle zresztą) ale ono jest tak ciężko dla mnie napisane ze nic nie rozumiem :(
Dana jest ujemna trzycyfrowa liczba dziesiętna w postaci znakowej:
kod ASCII najstarszej cyfry: x0110001
kod ASCII środkowej cyfry:x0110010
kod ASCII najmłodszej cyfry: x0110101
Podac kod U2 tej liczby
3.
Dana jest dwucyfrowa liczba szesnastkowa bez znaku w postaci znakowej :
kod ASCII starszej cyfry : x1000011
kod ASCII młodszej cyfry : x0111001
Zapisać tę liczbę w kodzie naturalnym


Weno mi pomóż to zrobić, jak sie do tego zabrać (oczywiście preliczenie na kartce papieru:))

harry180
Raczkujący użytkownik 1
Raczkujący użytkownik 1
Posty: 3
Rejestracja: wt 29 gru 2009, 19:17
Kontaktowanie:

pomocy!Nasmw będę wdzięczny:)

Postautor: harry180 » wt 29 gru 2009, 19:24

Witam :) mam problem bo jestem początkujący i nie bardzo znam zasady działania assemblera. a mam napisać program (Napisać program, który oblicza log2(x), gdzie x jest argumentem podanym przez użytkownika.[połączyć z C]) czy ma ktoś jakieś wskazówki jak to zrobić?;> z góry dzięki :]

^Target
Aktywny użytkownik 2
Aktywny użytkownik 2
Posty: 217
Rejestracja: śr 21 sty 2004, 9:45
Lokalizacja: okolice Bielska-Białej
Kontaktowanie:

Postautor: ^Target » wt 29 gru 2009, 22:02

Obliczenia tego typu na poziomie maszynowym sprowadzają się do zastosowanie jednej kilku z metod numerycznych, przykładowo rozwijania w szereg (patrz http://en.wikipedia.org/wiki/Logarithm#Basic_series lub książki w temacie Metody Numeryczne). O ile chodziłoby o liczby stricte całkowite (i zaokrąglone do całkowitej wyniki), można uprościć to do prostych operacji zliczania jedynek i rotacji bitów w słowie. W przeciwnym wypadku trzeba przyjąć jakiś standard notacji zmiennoprzecinkowej i napisać dość ambitny kawałek kodu, co byłoby dość skomplikowane. Języki wyższego poziomu pozwalają operować na dowolnym zdefiniowanym typie danych, pozostawiając całą sprzętową "mechanikę" obliczeń kompilatorowi i niebywały (jak dla asemblerowca) komfort pracy. Jednym słowem - zagadnienie wykonalne, ale bardzo kłopotliwe, czasochłonne i kompletnie nieuzasadnione. Jeśli jednak czujesz się na siłach, spróbuj zdesasemblować program obliczający taki logarytm napisany w C i zrozumieć, co się w nim dzieje. Nie muszę chyba dodawać, że uzyskana precyzja, zależna od przyjętego typu zmiennych będzie przynajmniej wykładniczo proporcjonalna do komplikacji wymaganych obliczeń...
chciałeś zrobić wzmacniacz, a wyszedł jak zwykle ... mieszacz :/

"Eksperci nie mają monopolu na dobre rady" - Bob Pease
nie jestem żadnym specjalistą

harry180
Raczkujący użytkownik 1
Raczkujący użytkownik 1
Posty: 3
Rejestracja: wt 29 gru 2009, 19:17
Kontaktowanie:

Postautor: harry180 » wt 29 gru 2009, 22:56

wraz z kolegą napisałem coś takiego co korzysta z C i oblicza a do x teraz tylko muszę to jakoś przerobić na log o ile wogóle da się to zrobić może ktoś ma jakiś pomysł?;> :)) ja powoli tracę wiarę ;/

section .text use32

global _ax

_ax:

; po wykonaniu push ebp i mov ebp, esp;
; [ebp] old EBP location
; [ebp+4] return pointfrom procedure
; [ebp+8] the first parameter of the procedure
; [ebp+12] the second parameter of the procedure

;cd c:\borland\bcc55\bin
;nasmw -o axo.obj -f obj ax.asm
;bcc32 ax.c axo.obj

%idefine a [ebp+8] ;pierwszy parametr z C
%idefine x [ebp+12] ;drugi parametr z C


push ebp
mov ebp, esp

finit

fld dword a ;st2 wczytuje podstawe potegowania, czyli liczbe a
fld dword a ;st1 wczytuje podstawe potegowania, czyli liczbe a
fild dword x ;st0 wczytuje wykladnik potegowania, liczba x

fistp dword [xx] ;zapisuje st0 do [xx] i zdejmuje ze stosu, teraz st0=a st1=a



potega: ;do odpalenia petli potegowania w st0 i st1 musi byc podstawa potegowania > a


xor ax,ax ;zerowanie ax
mov ax,[xx] ;kopiowanie [xx] do ax, [xx] = x czyli wykladnik
petlap:
cmp ax,1 ;porownywanie ax z 1
je exitpo ;jesli jest rowne to skacze do exitpo
sub ax,1 ;odejmowanie od ax - 1
fmul st1 ;mnozenie st0 * st1
loop petlap ;powtarznie petli
exitpo:


;LEAVE = mov esp, ebp / pop ebp
leave
ret
xx dd 0

^Target
Aktywny użytkownik 2
Aktywny użytkownik 2
Posty: 217
Rejestracja: śr 21 sty 2004, 9:45
Lokalizacja: okolice Bielska-Białej
Kontaktowanie:

Postautor: ^Target » śr 30 gru 2009, 0:34

Niestety, ja nadal egzystuję na poziomie asemblera na 8-bitowe mikrokontrolery, a x86 to zupełnie inna bajka. Pomęcz wyszukiwarkę hasłami x86 assembler mathematical routines. Czasami spotyka się alternatywne, pisane właśnie asemblerem funkcje lub kody źródłowe bibliotek dedykowanych. Niestety, więcej nie jestem w stanie pomóc
chciałeś zrobić wzmacniacz, a wyszedł jak zwykle ... mieszacz :/



"Eksperci nie mają monopolu na dobre rady" - Bob Pease

nie jestem żadnym specjalistą

harry180
Raczkujący użytkownik 1
Raczkujący użytkownik 1
Posty: 3
Rejestracja: wt 29 gru 2009, 19:17
Kontaktowanie:

Postautor: harry180 » wt 05 sty 2010, 1:19

zrobiłem ten program ale okazało się że mam go zrobić z jakiejś metody obliczeniowej a nie z funkcji na kooprocessorze ;/ ma ktoś jakieś pomysły jak zapisać ciąg Maclaurina(czy jakoś tak) w nasmw ?;>


Wróć do „Oprogramowanie wspomagające projektowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika. i 5 gości

cron