assembler zamiana znaku od poczatku i od konca

assembler zamiana znaku od poczatku i od konca
BE
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 8 lat
  • Postów:57
0

Witam, na zajeciach uzywamy DDosboxa 0.74 jako programu edytujacego pliki asm.
Niestety mam problem ktory nikt nie potrafi rozwiazac, mianiowicie nie moge wywolac wlasnego programu, wywolujac dana nazwe caly czas wyswietla mi sie calkowicie do innego niz to co znajduje sie w moim pliku, dlatego kieruje sie z prosba aby mi pomoc czy kod ktory napisalem jest dobry, zalaczony pozniej:

projekt ktory musze zrobic to : "Znaki kolejno od poczatku i od konca na zmiane np. autobus=asuutbo lub 123456=162534"

Kopiuj
 
ORG 100H

START:
;Znaki kolejno od poczatku i od konca na zmiane np.123456=162534
;wyswietlenie entera dla czytelnosci
	call czyszczenie
	call enter
	call wyswietl3
	
czyszczenie:
	XOR ax,ax
	XOR bx,bx
	XOR dx,dx
	xor di,di
	xor si,si
RET

enter:
	pusha
	mov dx, en
	mov ah,9
	int 21h
	popa
RET

wyswietl:
	pusha
	mov ah,9
	int 21h
	popa
RET
wyswietl2:
	pusha
	mov ah,2
	int 21h
	popa
RET

wyswietl3:
mov dx,tekst1
mov dx,tekst2
call wysw
call program
call wysw
call thend
end

wysw:
mov ah,9
int 21h
end


program:

mov di,0
mov si,11
mov ah,2
etyk1:
mov d1,[dane+di]
int 21h
mov di,[dane+si]
int 21h
dec si
dec si
inc di
inc di
cmp di,[dlugosc]
jl etyk1

end

thend:
mov ax, 4c00h
int 21h
RET

en db 10,13,36
tekst1 db "Autor: * nr.alb:* nr. projektu :2",10,13,36,'$'
tekst2 db "Projekt zamienia znaki kolejno od poczatku i od konca",10,13,36,'$'
tekst3 db "Wprowadz slowo/liczbe ktora mam odwrocic:",10,13,36,'$'
tekst4 db "Wynik:",32,36,'$'
dane db "autobus$"
dlugosc db 11

Prosze o pomoc

edytowany 1x, ostatnio: beli
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

No dobra ale problem masz z kodem czy z kompilacją i wywołaniem? Pokaż jak to kompilujesz i jak uruchamiasz.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
BE
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 8 lat
  • Postów:57
0

Wlasnie najlepsze jest to ze nie wiem czy mam problem z kodem bo nie moge go wywolac :P
w pliku play.bat mam zapisane dane do wywolania : C:\nasm\nasm -o wynik.com -f bin kk.asm

nastepnie wywoluje wynik.com ktory bazuje na play.bat

zwraca mi wartosc : A, a jakos nie widze zebym jej definiowal w programie.

Dlatego tez nie wiem czy program jest dobrze wywolany, prosze tutaj aby powiedziec czy dany kod jest dobrze napisany czy moze czegos mu brak, gdyz wydaje mi sie ze wszystko w nim uzglednilem.

edytowany 1x, ostatnio: beli
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1
  1. Co robi dyrektywa end i dlaczego używasz jej zamiast ret po call?
  2. Czemu piszesz ten kod jako spaghetti? o_O
  3. Za to:
Kopiuj
mov dx,tekst1
mov dx,tekst2

To cię powinni łamać kołem.
4. mov d1,[dane+di] to się w ogóle kompiluje?

Ten kod się w ogóle kompiluje? Weź to skompiluj z palca tą komendą z bata i zobacz czy ci czasem kompilator nie krzyczy czegoś...


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
BE
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 8 lat
  • Postów:57
0

Wybacz pomylilo mi sie poprawiłem:

Kopiuj
wyswietl3:
MOV AX,SEG tekst1
MOV DS,AX
MOV ES,AX
MOV SI,OFFSET tekst1
MOV DI,OFFSET tekst2
MOV CX,21
REP MOVSB 
call wysw
call program
call wysw
call thend
ret

mialo byc

Kopiuj
mov dl,[dane+di] 

Nie wiem czy sei kompiluje ja to wszystko z pamieci pisze dlatego prosze o pomoc, a jak wywoluje z palca to mi zwraca wartosc "A" bez bledow i rozkminiaj teraz co jest nie tak ;p

Dzieki bardzo za pomoc i czas poswiecony :)

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Ja sie pytam co ci nasm zwraca jak to próbujesz skompilować! Bo ja myśle że się nie kompiluje i cały czas uruchamiasz ten sam, stary plik.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
BE
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 8 lat
  • Postów:57
0

Wybacz nie ma powodu do nerwow :P: teraz mi przynjamniej zwraca blad, dziekuje Ci bardzo :)

43 linia tj:MOV SI,OFFSET tekst1 error : comma, decorator or end of line expected after operand
44 linia tj:MOV DI,OFFSET tekst2 error : comma, decorator or end of line expected after operand
(zbytnio nie wiem jak poprawic to wywolanie tekstu)
76 linia tj. error : symbol ' end' redefinied.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Czy ty sobie robisz jakieś jaja? Bo piszesz w nasmie a wrzucasz offset który jest slowem kluczowym masma. Ty w ogóle wiesz co robisz?


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
BE
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 8 lat
  • Postów:57
0

Hehe wybacz pomylily mi sei assemblery, bo jak mowie pisze z glowy, co do problemu w zlym katalogu mount dalem.

Tak wyglada kodzik:

z tym ze mam problem przy odwracaniu, petla dziala w nieskonczonosc, moze jakies pomysly :(?

Kopiuj
ORG 100H

START:
;Znaki kolejno od poczatku i od konca na zmiane np.123456=162534
;wyswietlenie entera dla czytelnosci
	call czyszczenie
	call enter
	call wyswietl0
	call enter
	call wyswietl
	call enter
	call wyswietl1
	call wyswietl2
	call enter
	call wyswietl3
	call koniec
	
czyszczenie:
	XOR ax,ax
	XOR bx,bx
	XOR dx,dx
	XOR di,di
	XOR si,si
RET

enter:
	pusha
	mov ah,2
	mov dl,10
	int 21h
	popa
RET
wyswietl0:
	pusha
	mov ah,9
	mov dx,tekst1
	int 21h
	popa
RET

wyswietl:
	pusha
	mov ah,9
	mov dx,tekst2
	int 21h
	popa
RET

wyswietl1:
	pusha
	mov ah,9
	mov dx,dane
	int 21h
	popa
RET

wyswietl2:
	pusha
	mov ah,9
	mov dx,tekst4
	int 21h
	popa
RET

wyswietl3:
call program
call wysw
ret

wysw:
mov ah,9
int 21h
ret


program:
mov di,0
mov si,11
mov ah,2
etyk1:
mov dl,[dane+di]
int 21h
mov di,[dane+si]
int 21h
dec si
dec si
inc di
inc di
cmp di,[dlugosc]
jl etyk1
ret

koniec:
mov ax, 4c00h
int 21h
RET

ENT DB 10,13,36
tekst1 db "' nr. projektu :2$",10,13,36,
tekst2 db "Projekt zamienia znaki kolejno od poczatku i od konca$",10,13,36,
tekst3 db "Wprowadz slowo/liczbe ktora mam odwrocic:$",10,13,36,
tekst4 db ", wprowadzona liczba, Wynik:$",32,36,
dane db "12345$",10,13,36
dlugosc db 11
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Odpal to pod emu8086 i wykonuj krok po kroku i zobaczysz co jest nie tak.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
BE
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 8 lat
  • Postów:57
0

Poprawiłem programik tak, z tym ze źle mi to konwertuje np. 123456 konwertuje mi na 163452, a powinno być 162534, generalnie nie mam pomysłu jak to usprawnić, gdyż jest to część kodu z zajęć który tam prowadzący udostępnił z moimi lekkimi zmianami.

Kopiuj
mov di,0 
 mov si,5 
 mov ah,2 
 etyk1: 
 mov dl,[dane+di]
 int 21h 
 xor dx,dx
 mov ah,2 
 mov dl,[dane+si]
 int 21h 
 dec si 
 dec si 
 inc di 
 inc di 
 cmp di,[dlugosc] 
 jl etyk1 
 jmp koniec 

i dodatkowo :

Kopiuj
dane db "123456$",36
dlugosc dw 6,36
edytowany 2x, ostatnio: beli
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

No ale przecież ten kod nie ma sensu i nie robi tego co chciałeś. Po co inkrementujesz i dekrementujesz o 2 skoro chcesz się przesuwać o 1? A ten twój warunek końca jest też bez sensu. Powinieneś liczyć ile liczb wypisałeś żeby to miało ręce i nogi. Skasuj ten kawałek kodu i napisz od nowa, tym razem myśląc.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
BE
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 8 lat
  • Postów:57
0

Udało się zrobic tak jak chce dla cyfr, 123456 odwraca na 162534, jednak przy liczbach jak chcialem np. zmienic autobus calkowicie co innego wyszlo, wiesz co moze byc przyczyna?

Kopiuj
program:
 mov di,0
 mov si,5
 mov ah,2 
 etyk1: 
 mov dl,[dane+di]
 int 21h 
 xor dx,dx
 mov ah,2 
 mov dl,[dane+si]
 int 21h 
 dec si
 inc di 
 cmp di,[dlugosc] 
 jl etyk1 
 jmp koniec
 ret
 
en db 10,13,36
dane db "123456$",36
dlugosc dw 3,36
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Ale czemu ty próbujesz programować metodą Monte Carlo? Myślisz że bezmyślne permutowanie tego kodu pomoże? Nie pomoże. Musisz właczyć myślenie. Póki nie będziesz rozumiał każdej linijki w tym kodzie to nic z tego nie będzie. Ten kod działa ci zupełnie przypadkiem bo masz przystą liczbę znaków. Dla nieparzystej (np. 12345) już nie zadziała poprawnie. A autobus ma 7 liter a ty pewnie nawet początkowej wartości dla di nie zmieniłeś, bo pewnie nawet nie wiesz że ona ma wskazywać na koniec ciągu...


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
BE
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 8 lat
  • Postów:57
0

Shalom jestem Ci naprawde wdzieczny za wszystkie Twoje odpowiedzi, jednak zamiast jebac moglbys doradzic, piszac na tym forum musisz sie liczyc ze ktos nie ma porownywalnej wiedzy do zalozmy Twojej, masz racje dziala to dla parzystych liczb, jednak dla nieparzystych bedzie brakowalo po prostu znaku lub bedzie jeden dodatkowy. Natomiast jezeli chodzi o wartosc di nie koniecznie ja zminialem a bardziej si, zalozmy:

Kopiuj
 mov di,0
 mov si,7
Kopiuj
dane db "d1u2p3a4$",36
dlugosc dw 4,36

Jest to parzysta liczba i jest ona dobrze wyswietlana, dla kazdej innej danej zmieniam wartosc. Wiem ze to moze byc frustrujace jezeli ktos pyta o rzeczy ktore ty interpretujesz jako podstawy, ale chyba po to wlasnie jest to forum ?

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

No dobra ale teraz jaki masz problem? Bo kod, pomijając kwestie nieparzystego inputu, powinien być ok.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
grzesiek51114
grzesiek51114
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:2442
0

Napisałem właśnie kod niezależny od parzystości długości łańcucha. Program wyznacza piwota, na którym kończy zamianę znaków:
NASM 32 bit

Kopiuj
global _main
extern _printf

section .data
slowo    dd    "kalejdoskop",0
fmt      db    "%c", 0 

section .bss
pivot      resd    1

section .text
liczDlugosc:
    mov edi, 0
    
    petla:
        inc edi
        cmp dword[slowo+edi+1], 0
        jne petla
    ret
    
wyznaczPiwot:
    xor edx, edx
    mov eax, edi
    mov ecx, 2 
    div ecx
    mov dword[pivot], eax
    ret
    
wypisz:
    push slowo
    call _printf
    add esp, 4
    ret

_main:
    call liczDlugosc
    call wyznaczPiwot
    mov esi, 0

zamiana:
    mov cl, byte[slowo+esi]
    mov al, byte[slowo+edi]
    mov byte[slowo+edi], cl
    mov byte[slowo+esi], al
    
    inc esi
    dec edi
   
    cmp edi, dword[pivot]
    jne zamiana

    call wypisz     

koniec:
    xor eax, eax
    ret
FU
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 9 lat
  • Postów:18
0

kolega wybrał najtrudniejszy temat jaki był na zajęciach :)

grzesiek51114
grzesiek51114
W sensie ja czy autor wątku? :)
Shalom
Serio? To był najtrudniejszy temat? o_O "za moich czasów" to się rysowało (pisząc po pamięci karty graficznej) zbiór mandelbrota albo wykresy funkcji zadanych szeregiem fouriera ;]
grzesiek51114
grzesiek51114
@Shalom on chyba żartował :-)
Shalom
Mam nadzieję ale nic mnie już nie zdziwi ;]
grzesiek51114
grzesiek51114
@Shalom BTW znasz może jakiś kompilator online gdzie mógłbym sobie w kodzie nasma zrobić externa dla funkcji z C? Na ideonie kombinowalem trochę i nie dziala, a przydałoby się wklejać linki do binarek online hehe
Shalom
Możesz zrobić taki serwis :P
grzesiek51114
grzesiek51114
Fakt :P
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)