Hello! I want to select numbers from a row of a matrix separated by spaces and put them into an array, or at least display them. However, it does not work. Here is the code:
LOCALS .model small .stack 100h .data CrLf db 0Dh, 0Ah, '$' A dw 8 dup (0) SizeA dw ($-A)/2 kbdBuffer db 6, 0, 6 dup(0) start db "start.txt",0 buf db ? Mas_A dw 100 Dup(?) Mas_B dw 100 Dup(?) num db 256 dup('$') .code main proc mov ax, @data mov ds, ax mov ax,3d00h ; открываем для чтения lea dx,start ; DS:dx указатель на имя файла int 21h ; в ax деcкриптор файла jc exit ; если поднят флаг С, то ошибка открытия mov bx,ax ; копируем в bx указатель файла xor cx,cx xor dx,dx mov ax,4200h int 21h ; идем к началу файла out_str: mov ah,3fh ; будем читать из файла mov cx,1 ; 1 байт lea dx,buf ; в память buf int 21h cmp ax,cx ; если достигнуть EoF или ошибка чтения jnz close ; то закрываем файл закрываем файл cmp buf,' ' je isFullNumber add dl,buf jmp out_str isFullNumber: ;call Str2Num ;call Show_AX mov ah, 9 mov dx, int 21h jmp out_str ;ввод масива ;mov cx, [SizeA] ;lea dx, [A] ;вывод массива ;call ShowArray close: ; закрываем файл, после чтения mov ah,3eh int 21h exit: ; завершаем программу mov ah,4ch int 21h main endp ;Ввод массива слов (word) ;cx - количество вводимых элементов ;ds:dx - адрес массива слов InputArray proc push ax push bx push cx push dx push si push di jcxz @@Exit ;если массив пустой - завершить mov si, 1 ;индекс элемента массива mov di, dx ;адрес текущего элемента массива @@ForI: ;вывод приглашения ввода элемента mov ah, 09h lea dx, PromptA1 int 21h mov ax, si call Show_AX mov ah, 09h lea dx, PromptA2 int 21h ;ввод числа mov ah, 0Ah ;ввод строки mov dx, offset kbdBuffer int 21h mov ah,09h ;перевод строки (на новую строку) lea dx, CrLf int 21h push si lea si, kbdBuffer+1 ; преобразование строки в число ;lea di, Numer call Str2Num pop si ; проверка на ошибку jnc @@NoError ; если есть ошибка ввода - повторить ввод jmp @@ForI ; если нет ошибки ввода - сохранить число @@NoError: ;сохранение введённого числоа в массиве mov [di], ax ;переход к следующему элементу inc si add di, 2 loop @@ForI @@Exit: pop di pop si pop dx pop cx pop bx pop ax ret InputArray endp ;Вывод массива слов (word) ;cx - количество выводимых элементов ;ds:dx - адрес массива слов ShowArray proc push ax push bx push cx push dx push si push di jcxz @@Exit ;если массив пустой - завершить mov si, 1 ;индекс элемента массива mov di, dx ;адрес текущего элемента массива @@ForI: mov ax, [di] call Show_AX mov ah, 02h mov dl, ' ' int 21h ;переход к следующему элементу inc si add di, 2 loop @@ForI @@Exit: pop di pop si pop dx pop cx pop bx pop ax ret ShowArray endp ; выводит знаковое 16-разрядное число из регистра AX на экран ; входные данные: ; ax - число для отображения Show_AX proc push ax push bx push cx push dx push di mov cx, 10 xor di, di ; di - кол. цифр в числе ; если число в ax отрицательное, то ;1) напечатать '-' ;2) сделать ax положительным or ax, ax jns @@Conv push ax mov dx, '-' mov ah, 2 ; ah - функция вывода символа на экран int 21h pop ax neg ax @@Conv: xor dx, dx div cx ; dl = num mod 10 add dl, '0' ; перевод в символьный формат inc di push dx ; складываем в стек or ax, ax jnz @@Conv ; выводим из стека на экран @@Show: pop dx ; dl = очередной выводимый символ mov ah, 2 ; ah - функция вывода символа на экран int 21h dec di ; повторяем пока di<>0 jnz @@Show pop di pop dx pop cx pop bx pop ax ret Show_AX endp ; преобразования строки в знаковое число ; на входе: ; ds:[si] - строка с числом ; ds:[di] - адрес числа ; на выходе ; ds:[di] - число ; CY - флаг переноса (при ошибке - установлен, иначе - сброшен) Str2Num proc push ax push bx push cx push dx push ds push es push si push ds pop es mov cl, ds:[si] xor ch, ch inc si cmp [si], byte ptr '-' jne @@IsPositive inc si dec cx @@IsPositive: jcxz @@Error mov bx, 10 xor ax, ax @@Loop: mul bx ; умножаем ax на 10 ( dx:ax=ax*bx ) mov [di], ax ; игнорируем старшее слово cmp dx, 0 ; проверяем, результат на переполнение jnz @@Error mov al, [si] ; Преобразуем следующий символ в число cmp al, '0' jb @@Error cmp al, '9' ja @@Error sub al, '0' xor ah, ah add ax, [di] jc @@Error ; Если сумма больше 65535 inc si loop @@Loop pop si push si or ax, ax js @@Error cmp [si+1], byte ptr '-' jne @@Positive neg ax or ax, ax jns @@Error @@Positive: mov [di], ax clc pop si pop es pop ds pop dx pop cx pop bx pop ax ret @@Error: xor ax, ax mov [di], ax stc pop si pop es pop ds pop dx pop cx pop bx pop ax ret Str2Num endp end main To reduce the search area, here is an error somewhere:
main proc mov ax, @data mov ds, ax mov ax,3d00h ; открываем для чтения lea dx,start ; DS:dx указатель на имя файла int 21h ; в ax деcкриптор файла jc exit ; если поднят флаг С, то ошибка открытия mov bx,ax ; копируем в bx указатель файла xor cx,cx xor dx,dx mov ax,4200h int 21h ; идем к началу файла out_str: mov ah,3fh ; будем читать из файла mov cx,1 ; 1 байт lea dx,buf ; в память buf int 21h cmp ax,cx ; если достигнуть EoF или ошибка чтения jnz close ; то закрываем файл закрываем файл cmp buf,' ' ;ЕСЛИ НАШЕЛ ТАЬУЛЯЦИЮ ЗНАЧИТ ЧИСЛО ПОЛНОЕ je isFullNumber add dl,buf ;ДОБАВЛЯЮ ВСЕ ЦИФРЫ ЧИСЛА КОТОРОЕ НАЙДУ В DL jmp out_str isFullNumber: ;call Str2Num ;call Show_AX mov ah, 9 mov dx, int 21h jmp out_str ;ввод масива ;mov cx, [SizeA] ;lea dx, [A] ;вывод массива ;call ShowArray close: ; закрываем файл, после чтения mov ah,3eh int 21h exit: ; завершаем программу mov ah,4ch int 21h main endp I tried to find each digit of the number and throw them in the DL, and at the meeting of the tab to bring out the DL.