assembler zamiana znaku od poczatku i od konca

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"

 
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

0

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

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.

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:
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ś...

0

Wybacz pomylilo mi sie poprawiłem:

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

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 :)

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.

0

Wybacz nie ma powodu do nerwow 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.

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?

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 :(?

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
0

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

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.

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 :

dane db "123456$",36
dlugosc dw 6,36
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.

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?

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
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...

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:

 mov di,0
 mov si,7
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 ?

0

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

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

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
0

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

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