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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.02.2015, 18:27   #1
Илья2014
 
Регистрация: 15.02.2014
Сообщений: 6
По умолчанию Ассемблер. Двумерный массив

У меня такая проблема. У меня есть файл, в котором двумерный массив, необходимо вывести сначала размерность массива, потом сам двумерный массив, и вывести одномерный массив состоящий из отрицательных элементов. Как вывести размерность массива я не представляю! По поводу отрицательных элементов тоже особых мыслей нету, только если сравнить аски-код элементов, но как это реализовать тоже не понятно. Попытался вывести сам двумерный массив, но получается вывести только первый символ(
Код:
stacks segment para stack 'stack'
db 64 dup(?)
stacks ends
data segment para 'data'
	fn db 'text123.txt',0
	nam dw ?
	bf db 10 dup(?)
data ends
code segment para 'code'
	assume cs: code, ds: data, ss: stacks
count	PROC FAR		
		mov ax,data
		mov ds,ax


		mov ah,3Dh		;открываем
		mov al,2
		mov dx,offset fn
		int 21h
		mov nam,ax

out1:
		mov ah,3Fh	;читаем из файла			
		mov bx,nam
		mov cx,4h
		lea dx,bf
		int 21h
		
		cmp ax,cx
        	jnc close
        	mov dl,bf
        	mov ah,4h
        	int 21h
        	jmp out1
        
close:
       		mov ah,40h
        	mov bx,1 ;номер экрана
        	mov cx,2
        	mov dx,offset bf
        	int 21h
 
 	        mov ah,4Ch ;завершение
                int 21h
count   ENDP
code ENDS
    END count
Илья2014 вне форума Ответить с цитированием
Старый 16.02.2015, 21:56   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Илья2014
У меня есть файл, в котором двумерный массив
Илья2014, Вам не кажется, что именно исходя из того, что у Вас в файле, какого он типа, как там представлен двухмерный массив и т.д. и т.п. и следует дальше плясать?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.02.2015, 05:14   #3
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,609
По умолчанию

У беззнаковых целых чисел (signed) один бит занимает знак, так можно определить, отрицательное число или нет. Чтобы достать этот бит, нужно осуществить операции левого (SHL) и правого сдвига (SHR). Размер сдвига зависит от количества бит, занятых числом. В регистре ax - 16 битные числа.

Чтобы определить, что массив закончился, нужно, чтобы массив заканчивался определенным символом, например, строки терминируются нулем.

Размерность массива определяется последовательным считыванием и увеличением на единицу значения счетчика.
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Старый 17.02.2015, 09:03   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,830
По умолчанию

Цитата:
У беззнаковых целых чисел (signed) один бит занимает знак, так можно определить, отрицательное число или нет.
1. у знаковых
2. есть представления без знакового бита
p51x вне форума Ответить с цитированием
Старый 23.02.2015, 13:29   #5
Илья2014
 
Регистрация: 15.02.2014
Сообщений: 6
По умолчанию

Как сделать чтобы из файла считывались не только числа от -9 до 9, но и больше? Доступный промежуток если не ошибаюсь от -128 до 127
Вложения
Тип файла: txt Массив.txt (5.5 Кб, 119 просмотров)
Илья2014 вне форума Ответить с цитированием
Старый 23.02.2015, 15:01   #6
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 474
По умолчанию

Ну а как бы ты мысленно преобразовывал строку "123" в число?
1. Инициализация: result:=0
2. result:=result*10
3. Берём очередной символ ("1"), преобразуем его в число x и добавляем к result: result:=result+x
4. Если строка не закончилась, то переходим к п.2.

Вот пример для преобразования в двухбайтовое знаковое число. На входе паскалевская строка - т.е. ds:[di] указывает на длину строки, а ds:[di+1] уже на первый символ строки.
Код:
; преобразования строки в число
; на входе:
; 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


        mov     bx, 10
        xor     ax, ax

        ;если в строке первый символ '-'
        ; - перейти к следующему
        ; - уменьшить количество рассматриваемых символов
        cmp     byte ptr [si], '-'
        jne     @@Loop
        inc     si
        dec     cx
@@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
        cmp     ax, 8000h
        ja      @@Error
        inc     si

        loop    @@Loop

        pop     si         ;проверка на знак
        push    si
        inc     si
        cmp     byte ptr [si], '-'
        jne     @@Check    ;если должно быть положительным
        neg     ax         ;если должно быть отрицательным
        jmp     @@StoreRes
@@Check:                   ;дополнительная проверка
       or       ax, ax     ;
       js       @@Error
@@StoreRes:                ;сохранить результат
        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
Ты можешь переделать так:
-длину строки с числом, определяемую в основной программе, передавать в cx
-переделать под байты

Мне уже давно недоступен DOS и переделать сам я уже ничего не могу.
Предвидя вопрос об преобразовании двухбайтового числа в строку (вывод на экран, но можно переделать и в буфер памяти)
Код:
; выводит число в регистре AX на экран
; входные данные:
; cx - система счисления (не больше 10)
; ax - число для отображения
Show_ax PROC
;        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
        ret
Show_ax ENDP
FPaul вне форума Ответить с цитированием
Старый 23.02.2015, 15:12   #7
Илья2014
 
Регистрация: 15.02.2014
Сообщений: 6
По умолчанию

Может я что-то не так делаю, но у меня сбивается весь массив на экране... и вместо массива у меня получается строка, и результата никакого
Илья2014 вне форума Ответить с цитированием
Старый 23.02.2015, 15:21   #8
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 474
По умолчанию

Пока никто не подошел, попробуй пройтись отладчиком. Если tasm, то отладчик зовут td.exe (TurboDebugger). Он идёт в комплекте с tasm. В сети должны быть руководства по работе с ним. Тебе нужно лишь настроить окно сегмента данных, ходить по-шагам и смотреть регистры и в сегмете данных переменные, мысленно сравнивать полученные и ожидаемые результаты.

Заодно увидишь присутствие или отсутствие ошибок чтения/записи из/в файл. Ты не обрабатываешь - а зря.

Пожалуй это лучшее, что могу предложить.
FPaul вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программирование в VBA: двумерный массив M на N, нужно создать новый одномерный массив TheAnnihilyator Помощь студентам 1 04.06.2014 09:16
Java: Дан двумерный массив чисел А размером 6х6 и одномерный массив Х из 6-ти чисел. Заменить первые три строки массива A vikysha55 Помощь студентам 1 16.04.2014 10:50
Двумерный массив развернуть в одномерный массив по строкам[QBASIC] TrueStyle777 Помощь студентам 3 29.05.2013 21:56
Одномерный массив и Двумерный массив eugene1437 Общие вопросы C/C++ 15 25.05.2011 19:17
Двумерный массив, одномерный массив. Branbal Помощь студентам 14 18.11.2009 12:40