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.

  • First, at the beginning of a dx loop, it is used to transfer the value to int 21h, and at the end of the loop (before the next iteration), you keep dl (which is half of dx). thus, in the loop, you spoil the value just saved. And when the cycle is completed, then in dl the younger part of the address loaded there will be lea dx, buf. - Mike
  • Secondly, after correcting this and storing the value for example on the stack (int 21h corrupts all registers) you will find another problem. You probably have a number in the input file represented by numbers. for example, the value 1 is a byte with the value 0x31. If you need to work with the algorithm as with a number, then you need to subtract 0x30 from it. And what next, I do not understand, in the task I don’t see that it is necessary to get exactly the sum of digits of the number, but now you are trying to get it. PS, before displaying any number on the screen, you will also need to translate it from binary to displayable characters - Mike

0