Вместо ожидаемого массива выводит набор символов непонятных - 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

Оцени полезность:

12   голосов , оценка 3.25 из 5
Похожие ответы