Вместо ожидаемого массива выводит набор символов непонятных - Assembler
Формулировка задачи:
Здравствуйте, у меня такая проблема, есть условия, отсортировать слова в строке по количеству больших букв, я придумал алгоритм, не знаю может и не самый лучший но главное сам, моя функция чтения строки сразу записывает строку в массив следующим образом: Оригинальная строка: "This_IS_Max" , в массиве будет записанно "_This1_IS2_Max1_" под символом '_' имеется виду пробел, дебажил вроде всё правильно по алгоритму моему идёт, но когда хочу вывести мой массив выводит кучу непонятных символов, помогите пожалуйста, заранее благодарен, вот мой код(извините если это гавнокод, я только начинаю на ассемблере):
.model small org 100h .data InputMessage dw "Write your string:",10,13,"$" count dw 0 i dw 0 j dw 0 lengthACount dw 0 lengthASimbols dw 0 ASimbols dw 20 dup ('') ACount dw 20 dup ('') .code Program: mov ax, @DATA mov ds, ax lea dx, InputMessage mov ah, 09 int 21h mov i, 0 xor si,si call ReadString lea dx, ASimbols mov ah, 09 int 21h int 20h ends Program; ReadString PROC ;------------------------ mov bx, 2000 ; mov ASimbols[si], bx ; write Space to ASimbols inc si ; inc lengthASimbols ; ;------------------------ ; Start: ; xor ax,ax ; mov ah, 01 ; Read simbol int 21h ; ;-------------------- ; cmp al, 13 ; if simbol == Enter go to IsEnter je IsEnter ; ;---------------- ; cmp al, 32 ; if simbol == Space go to IsSpace je IsSpace ; ;------------------------ ; ;CheckoutOnBigLetters ; cmp al, 5Bh ; if simbol < 'Z' then go to NextCheckout jl NextCheckout ; ;---------------------------- ; NotBig: ; mov bx, ax ; count write to ASimbols mov ASimbols[si], bx ; inc si ; jmp Start ; inc lengthASimbols ; ;---------------------------- ; NextCheckout: ; cmp al, 40h ; if simbol > 'A' jg IsABigLeter ; ;---------------- ; jmp NotBig ; ;---------------------------- ; IsABigLeter: ; inc count ; mov ASimbols[si], bx ; count++ write to ASimbols inc si ; inc lengthASimbols ; jmp Start ; ;---------------------------- ; IsSpace: ; mov bx, count ; mov ASimbols[si], bx ; count to ASymbols inc si ; ; mov bx, 2000 ; mov ASimbols[si], bx ; Space to ASymbols inc si ; ; mov i, si ; mov si, j ; mov bx, count ; cout to ACount and count = 0 mov ACount[si], bx ; inc si ; mov j,si ; mov si,i ; mov count,0 ; inc lengthACount ; inc lengthASimbols ; inc lengthASimbols ; jmp Start ; ;------------------------ ; IsEnter: ; ; mov bx, count ; mov ASimbols[si], bx ; count to ASymbols inc si ; ; mov bx, 2000 ; mov ASimbols[si], bx ; Space to ASymbols inc si ; inc lengthASimbols ; inc lengthASimbols ; ret ; ;------------------------ ReadString endp
Решение задачи: «Вместо ожидаемого массива выводит набор символов непонятных»
textual
Листинг программы
.model small org 100h .data InputMessage dw "Write your string:",10,13,"$" enter dw 10,13, "$" count dw 0 i dw 0 j dw 0 lengthACount dw 0 lengthASimbols dw 0 ASimbols db 20 dup ('?') ACount db 20 dup ('?') .code Program: mov ax, @DATA mov ds, ax lea dx, InputMessage mov ah, 09 int 21h mov i, 0 mov si, i call ReadString call WriteResult int 20h ends Program; ReadString PROC ;------------------------ mov bx, 20h ; mov ASimbols[si], bl ; write Space to ASimbols inc si ; inc lengthASimbols ; ;------------------------ ; Start: ; xor ax,ax ; mov ah, 01 ; Read simbol int 21h ; ;-------------------- ; cmp al, 13 ; if simbol == Enter go to IsEnter je IsEnter ; ;---------------- ; cmp al, 32 ; if simbol == Space go to IsSpace je IsSpace ; ;------------------------ ; ;CheckoutOnBigLetters ; cmp al, 5Bh ; if simbol < 'Z' then go to NextCheckout jl NextCheckout ; ;---------------------------- ; NotBig: ; mov ASimbols[si], al ; count write to ASimbols inc si ; inc lengthASimbols ; jmp Start ; ;---------------------------- ; NextCheckout: ; cmp al, 40h ; if simbol > 'A' jg IsABigLeter ; ;---------------- ; jmp NotBig ; ;---------------------------- ; IsABigLeter: ; inc count ; mov ASimbols[si], al ; count++ write to ASimbols inc si ; inc lengthASimbols ; jmp Start ; ;---------------------------- ; IsSpace: ; mov bx, count ; add bx, 48 ; mov ASimbols[si], bl ; count to ASymbols inc si ; ; mov bx, 20h ; mov ASimbols[si], bl ; Space to ASymbols inc si ; ; mov i, si ; mov si, j ; mov bx, count ; count to ACount and count = 0 add bx, 48 ; mov ACount[si], bl ; inc si ; mov j,si ; mov si,i ; mov count,0 ; inc lengthACount ; inc lengthASimbols ; inc lengthASimbols ; jmp Start ; ;------------------------ ; IsEnter: ; ; mov bx, count ; add bx, 48 ; mov ASimbols[si], bl ; count to ASymbols inc si ; ; mov bx, 20h ; mov ASimbols[si], bl ; Space to ASymbols inc si ; ; mov bx, count ; add bx, 48 ; mov i, si ; mov si, j ; mov ACount[si], bl ; mov j, si ; mov si, i ; inc lengthACount ; inc lengthASimbols ; inc lengthASimbols ; ret ; ;------------------------ ReadString endp WriteResult proc lea dx, enter mov ah, 09 int 21h xor cx,cx xor bx,bx mov cx,lengthACount; print: mov ah, 02h mov dl, ACount[bx] inc bx int 21h loop print ret WriteResult endp