Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.05.2011, 16:59   #1
ЛерочкаPj
 
Регистрация: 31.05.2011
Сообщений: 3
Смущение Почему вместо посчитанной суммы, в файл записывается непонятная абракадабра?

Почему в файл записывается не посчитанная сумма, а непонятная абракадабра???
Код:
 ;создать файл A_20.TXT.присвоить переменной n целое положительное значение.
 ;ввести матрицу типа n*n целых двузначных чисел.записать её в файл.найти сумму
 ;элементов столбцов верхней треугольной матрицы и результат дописать в файл.
 ;______________________________________________________________________________

 cseg segment
 assume cs:cseg,ds:dseg,es:dseg,ss:sseg

 crlf macro ;макрос перевода строки
 push ax
 push dx
 mov ah,02h
 mov dl,0dh
 int 21h
 mov dl,0ah
 int 21h
 pop dx
 pop ax
 endm

 print_msg macro msg ;макрос вывода строки на экран
 push ax
 push dx
 mov ah,09h
 mov dx,offset msg
 int 21h
 pop dx
 pop ax
 endm 

 start: mov ax,dseg
 mov ds,ax
 mov es,ax

 ;Запрос на ввод числа n и собственно ввод его(пусть n не больше 99)

 print_msg prmt_n 
 call inpt_nmbr
 mov n,al ;запишем введенное число в переменную n
 xor cx,cx
 mov cl,al ;в cl число n

 ;Запрос на ввод и сам ввод матрицы 

 print_msg prmt_mtr
 crlf
 mov di,offset matrica
 in_mtr: push cx
 mov cl,n ;счетчик элементов строки матрицы 
 in_str: call inpt_nmbr
 stosb
 mov al,' '
 int 29h
 loop in_str 
 crlf
 pop cx
 loop in_mtr

 ;Запишем элементы матрицы в файл my_file.dat

 mov ah,3ch ;создание и открытие файла 
 mov cx,0 ;без атрибутов
 mov dx,offset fname ;адрес имени файла
 int 21h
 mov hndl,ax ;сохраним дескриптор
 mov al,n
 mov cl,al
 mul cl 
 mov cx,ax
 add cl,n
 adc ch,0 ;в cx теперь число записываемых байт
 push cx ;сохраним его в стеке
 mov ah,40h ;функция записи
 mov bx,hndl
 mov dx,offset matrica
 int 21h

 ;Вычисление сумм столбцов верхнетреуг. матрицы и запись их в файл

 xor cx,cx
 mov cl,n
 mov bx,cx
 dec bx
 nxt_cn: push bx
 push cx
 xor ax,ax
 sum: add al,matrica[bx]
 adc ah,0
 add bl,n
 loop sum
 pop cx
 pop bx
 dec bx
 push ax ;сохраним в стеке вычисленную сумму столбца
 loop nxt_cn

 mov bx,hndl
 mov dx,offset rslt
 mov cx,1
 cntn: mov ah,40h ;Дописываем суммы в файл
 pop si ;Сумму из стека отправим
 mov rslt,si ;в переменную rslt
 int 21h ;Запись
 dec n
 jnz cntn 

 ;Выход в DOS

 mov ax,4c00h
 int 21h

 inpt_nmbr proc
 push cx
 push dx
 push si
 xor si,si ;индексирование символов в buf
 mov ah,07h ;ввод символа без эха
 in_nr: int 21h 
 cmp al,0dh ;<Enter>?
 je enter ;да, число введено
 cmp al,'0' ;введенный символ меньше нуля ?
 jb in_nr ;да, введенный символ не цифра, повтор ввода
 cmp al,'9' ;введенный символ больше 9 ?
 ja in_nr ;да, введенный символ не цифра, повтор
 int 29h ;введен цифровой символ, отобразим его
 sub al,30h ;и преобразуем в цифру
 mov buf[si],al ;сохраним в переменной buf 
 inc si ;si -> след. байт в buf
 cmp si,2 ;ввели 2 цифры ?
 jb in_nr ;нет еще, продолжим
 enter: mov cx,si ;скопируем число введенныых цифр в счетчик
 xor ax,ax ;в ax будем собирать введенные цифры в одно число
 xor si,si ;si -> первый байт в buf
 cnvrt: mov dx,10 ;десятичная сист. счисления
 mul dx ;число в ax умножаем на 10
 mov dl,buf[si] ;берем след. байт в buf
 add ax,dx ;складываем с числом в ax
 inc si ;si -> след. байт в buf
 loop cnvrt ;сделать cx раз(в нашем случае не более двух раз)
 pop si
 pop dx
 pop cx
 ret
 inpt_nmbr endp

 cseg ends

 dseg segment

 prmt_n db 'Vvedite chislo n: $' 
 prmt_mtr db 0dh,0ah,'Vvedite elementy matr: $'
 n db ?
 buf db 2 dup (0) ;буфер для ввода двузначного числа
 fname db 'A_20.txt',0
 hndl dw ? ;дескриптор файла
 rslt dw 0
 matrica db ? 

 dseg ends

 sseg segment stack

 db 256 dup (0)

 sseg ends

 end start

________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 31.05.2011 в 20:30.
ЛерочкаPj вне форума Ответить с цитированием
Старый 31.05.2011, 17:08   #2
xxxyyyzzz
Пользователь
 
Регистрация: 25.05.2011
Сообщений: 13
По умолчанию

Ты пишешь, что она работает, а TASM выдаёт 15 ошибок.
Это та программа, что ты писала или это так, какой то левый экземпляр для вида?
xxxyyyzzz вне форума Ответить с цитированием
Старый 31.05.2011, 17:47   #3
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Компилятор лень качать, чтобы проверять, потому то, что бросилось в глаза -
сумма, внезапно, хранится в памяти в двоичном виде. Перед записью в файл ее стоило бы преобразовать в строку.
И память для матрицы ты смело-дерзко выделяешь, рискуя переписать находящийся следом за сегментом данных сегмент.
Ну и файл надо закрывать перед выходом в дос (функция 3Eh прерывания 21h).
Son Of Pain вне форума Ответить с цитированием
Старый 31.05.2011, 18:56   #4
ЛерочкаPj
 
Регистрация: 31.05.2011
Сообщений: 3
По умолчанию

Программа у меня работает.(только тут на форуме, во второй строке символы в смайлик превратились))
но в файл что-то типа этого записывается:
-Ю6Ю""8N 9$6
INTGb*= !)
$ $[С…
ЛерочкаPj вне форума Ответить с цитированием
Старый 31.05.2011, 18:58   #5
ЛерочкаPj
 
Регистрация: 31.05.2011
Сообщений: 3
По умолчанию

вместо смайла вот это : d
ЛерочкаPj вне форума Ответить с цитированием
Старый 31.05.2011, 19:22   #6
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

В файл, опять же, записывается двоичное представление введенных чисел. Не текстовое. Потому оно так и выглядит.
Son Of Pain вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Абракадабра какая-то dubailand Общие вопросы Delphi 7 21.05.2011 10:27
Абракадабра в Memo Тутонхамон Работа с сетью в Delphi 3 22.03.2011 09:40
Как в С++ записывается логарифм по основанию? Гамбит Помощь студентам 27 14.03.2010 23:03
Как записывается дробное число. Altera Свободное общение 2 18.12.2009 20:30
создайте файл,содержащий суммы соответствующих чисел файлов Zara Паскаль, Turbo Pascal, PascalABC.NET 1 02.12.2008 19:26