Mam pewien problem ( nawet 2) z programem w asemblerze. Mam napisać program, który wyświetla odbicie lustrzane tekstu. Moje problemy to:
Nie wiem dlaczego program nie dodaje na końcu ‘$’
i nie wiem jak mam zliczać ilość znaków w tekscie.
Kod programu:
.MODEL TINY
.DATA
dl_zdania equ 11d; przypisz liczbe 11 dziesiętnie // EQU to dyrektywa asemblera, a w miejscu wartość wstawiasz liczbę.
;Przy czym jako wartość można wstawić też nazwę rejestru (np. R5). Przy kompilacji asembler zastępuje wszędzie symbol wartością zadeklarowaną przez Ciebie.
;Raz zadeklarowanej wartości nie można zmienić.
TEXT db 'Jakis text!$'; tekst do odrocenia
TXET db ? ;tekst po odwroceniu
.CODE
Start:
mov cx, dl_zdania ; do rejestru liczka wstawiamy 11
mov bx, offset txet ;wskazujemy adres początku zmiennej txet
mov si, dl_zdania ;do rejestru indexowego wstawiamy 11
; loop1:
; cmp word ptr [di + text], 3h
; mov si, di
; je loop2
; inc di
; jne loop1
loop2:
mov al, [si + text] ;kopiujemy do al to co jest w adresie si + text(zzmiena text jest zawsze adresem poczatku zmiennej text)
mov ah, 0h; dla pewnosci zerujemy ah
mov [bx], ax ;do adresu na który wskazuje bx pzrenosimy wartość ax
inc bx ; powiększamy bx o 1
cmp si, 0; sprawdzamy czy si = 0
sub si, 1; pomniejszamy si o 1
ja loop2; jeżeli si >= 0 to skacze do linijki 14
jz dodaj; jeżeli si = 0 to skacze DO linii 23
dodaj:
inc bx ; powiększamy bx o 1
mov al, '$' ;kopiujemy do al znak końca textu
mov ah,0h ; dla pewnosci zerujemy ah
mov [bx], ax ;do adresu na który wskazuje bx pzrenosimy wartość ax
Koniec:
mov ah,4ch ; zatrzymanie procy
int 21h ;wywołanie systemu DOS
.Stack 100h ; ustawianie stosu
end start
end
Kiedy ma niby druga pętla się skończyć? U ciebie działa dopóki nie wlezie na jakiś zabezpieczony obszar pamięci i windowsy nie wywalą program z pamięci.
Może jednak zrobisz tak jak zaproponowałem post wyżej?
NIe chce, bo im bardziej skoplikowany kod tylko gorzej sie go zrozumieć na początku( to mój pierwszy program w asemblerze). Poza tym mam nie kumatego partnera w grupie, więc wole nie ryzykować.
To ty jesteś nie kumaty, ja proponuje najprostszy i najkrótszy wariant:
mov al,36
mov di,OFFSET text
mov si,di
cld
repne scasb
dec di
odwrocenie:
cmp si,di
jae Koniec
mov al,[si]
mov ah,[di]
mov [si],ah
mov [di],al
inc si
dec di
jmp odwrocenie
Koniec: