IPB
ЛогинПароль:

> ПРАВИЛА РАЗДЕЛА!!!

1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Помогите решить задачу с матрицей (ассемблер)
сообщение
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Объясните пожалуйста как можно выполнить следующее задание: Дана матрица 6х5. Вычеркнуть столбец с заданным номером.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


На каком этапе выполнения возникают сложности?
Показывай, что уже сделал.


Вообще - по сути - надо удалить каждый n-ный элемент (т.е. сдвинуть все, что после него стоит).


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Я вообще не представляю как в компиляторе можно представить матрицу. Задания которые мне приходилось делать были на выполнение арифметических действий (с ассемблером я очень мало знаком)-это не трудно-результат видишь в определенном регистре. А тут нужно как-то сделать целую матрицу, да еще столбец вычеркнуть. Про матрицы я сейчас пытаюсь разобраться, но как вычеркнуть столбец мне вообще не ясно
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


(просьба не придираться - объясняю все упрощенно, упуская некоторые не значимые в данном случае нюансы)
Пишу в предположении, что ты правда хочешь разобраться, а не "лишь бы сдать".
Человеку удобно представлять матрицу в виде строк и столбцов:
1 2 3
4 5 6
7 8 9
компьютеру так неудобно. он будет хранить данные как
1 2 3 4 5 6 7 8 9
а где-то отдельно - информацию о том, как эти данные трактовать (что это 3*3, а не 9*1 или 1*9).

То есть задача сводится к удалению каждого 3-го элемента:
1 2 x 4 5 x 7 8 x
Теперь - матрицы применительно к ассемблеру (еще раз повторюсь - ему все равно, одномерный массив или двумерный! это - понятия из языков выского уровня).

вот небольшой пример работы с массивом:
;нахождение суммы нечетных элементов массива
.model small
.stack 512
.data
mas db 10 dup (31, 11, 26, 10, 8, 48, 21, 16, 65, 28)
sum dw 0
.code
;заносим адрес сегмента данных в DX
mov AX, @data
mov DS, AX
mov AX,0

;заносим адрес массива в BX
mov BX, offset mas
;в SI будем хранить номер элемента
mov SI,0
start:
;если дошли до последнего элемента
cmp SI,10
;переходим на метку finish
je finish

;заносим в AL элемент массива с номером SI
mov AL,[BX][SI]

;если число четное - переходим к метке cont
test AL,00000001b
jz cont
;иначе - прибавляем число к сумме
add AX,sum
mov sum,AX
cont:
;увеличиваем значение счетчика
inc SI
jmp start

finish:
mov ax,4c00h
int 21h
end

попробуй для начала разобраться в этом.
Возникнут вопросы - пиши...


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


большое спасибо мисс граффити!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Задача такая:
Дана матрица 6х5. Вычеркнуть столбец с заданным номером
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(1147 @ 19.10.2008 14:25) *
Вычеркнуть столбец с заданным номером
Как организована память для матрицы? По строкам или по столбцам?


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


по столбцам
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(1147 @ 20.10.2008 0:44) *
по столбцам
Ну, тогда все просто. Кусок памяти,начинающийся сразу за вычеркиваемым столбцом и содержащий весь остаток матрицы, двигаешь влево на длину столбца.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


мне непонятно только как и где задать номера столбцов матрицы чтобы я мог осуществить сдвиг с такого-то столбца влево
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(1147 @ 20.10.2008 11:49) *
как и где задать номера столбцов матрицы

Их не надо нигде как-то специально задавать. Просто вычисляешь по ним адрес. Например, адрес начального элемента i-того столбца будет:
ci = a + i*lc ,
где
ci - адрес начало i-того столбца,
a - адрес начала матрицы,
lc - длина столбца.
Это при условии, что числа однобайтовые, и нумерация идет с нуля.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


вот у меня кое-что получилось, но неправильно... в методичках насчет операции вычеркивания ничего нет. Делал по образцу примера по обработке массива

Start:
mov DI,0
mov ECX,2; номер вычеркиваемого столбца

cycle1:
push ECX
mov ECX,5
mov ECX,6
mov EBX,0
cycle2:
Mov AL, A+1[EBX]
MOV A[EBX],AL
ADD EBX,5
loop cycle2
pop ECX
loop cycle1
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гость






Какой у тебя ассемблер, уточни...

Вот так должно отработать под TASM-ом (ты сказал, что у тебя матрица организована "по столбцам"):

; ...

.data
mx db 1, 2, 3, 4, 5 ; 1-ый стоблец
db 21, 22, 23, 24, 25 ; 2-ой столбец
db 31, 32, 33, 34, 35
db 41, 42, 43, 44, 45
db 51, 52, 53, 54, 55

rows dw 5 ; число столбцов
cols dw 5 ; число элементов в каждом столбце

to_delete equ 4 ; номер столбца для удаления

.code

; ну, тут разные процедуры, в частности - PrintMatrix для проверки

start:
mov ax, @data
mov ds, ax ; не забываем установить сегментные регистры !!!

push ds
pop es ; установка ES понадобится при использовании REP MOVSB

lea di, mx
call PrintMatrix ; печатаем начальную матрицу


mov ax, rows
sub ax, to_delete
mul cols
mov cx, ax ; счетчик повторений для REP MOVSB

cld ; проход слева направо
mov ax, to_delete
dec ax
mul cols

lea di, mx ; начало матрицы
add di, ax ; "приемник" для REP MOVSB

mov si, di
add si, cols ; "источник"для REP MOVSB

rep movsb ; ds:[si] -> es:[di]
dec rows ; уменьшаем число столбцов

lea di, mx
call PrintMatrix ; печатаем полученную матрицу

; все, можно выходить
mov ax, 4C00h
int 21h

end start

 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


у меня Radasm
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Гость






RadASM - это среда разработки... Она работает со многими компиляторами: и с MASM-ом и с TASM-ом, FASM и NASM тоже поддерживаются... Вот я и спрашиваю, чем именно из вышеперечисленного ты пользуешься?

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


тогда Masm

Добавлено через 14 мин.
masm32 точнее
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Гость






Ну, а MASM - это вообще отдельный разговор. Тут все еще проще:

.486
.model flat, stdcall
option casemap :none

include F:\masm32\include\windows.inc ; always first
include F:\masm32\macros\macros.asm ; MASM support macros

; -----------------------------------------------------------------
; include files that have MASM format prototypes for function calls
; -----------------------------------------------------------------
include F:\masm32\include\masm32.inc
include F:\masm32\include\gdi32.inc
include F:\masm32\include\user32.inc
include F:\masm32\include\kernel32.inc

; ------------------------------------------------
; Library files that have definitions for function
; exports and tested reliable prebuilt code.
; ------------------------------------------------
includelib F:\masm32\lib\masm32.lib
includelib F:\masm32\lib\gdi32.lib
includelib F:\masm32\lib\user32.lib
includelib F:\masm32\lib\kernel32.lib

.data
mx dword 1, 2, 3, 4, 5
dword 21, 22, 23, 24, 25
dword 31, 32, 33, 34, 35
dword 41, 42, 43, 44, 45
dword 51, 52, 53, 54, 55

rows dword 5
cols dword 5
to_delete equ 4

.code

start:
call main
exit

main proc

call PrintTable
print chr$(13, 10)

mov eax, rows
sub eax, to_delete
mul cols
mov ecx, eax

cld
mov eax, (to_delete-1)*sizeof(dword)
mul cols

mov edi, offset mx
add edi, eax

mov esi, edi
mov eax, sizeof(dword)
mul cols
add esi, eax
rep movsd

dec rows
call PrintTable

Ret
main EndP

PrintTable proc

mov esi, offset mx

mov ebx, cols
mov edx, rows

mov edx, rows
.while edx > 0
push edx
print chr$(13, 10)
pop edx

mov ecx, ebx
.while ecx > 0
mov eax, [esi]
push ebx
push ecx
push edx
print str$(eax)
print chr$(' ')
pop edx
pop ecx
pop ebx
add esi, sizeof(dword)
dec ecx
.endw
dec edx
.endw

Ret
PrintTable EndP
end start

 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


спасибо, попытаюсь разобраться...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


М
1147, почему надо было создавать две одинаковые темы?? Чтобы модераторы не скучали?..
Объединяю темы.
Руки чешутся закрыть, но боюсь, появится еще одна..




Добавлено через 3 мин.
Всем рекомендую посмотреть, как человек за 40 дней полностью забывает все и начинает по новой (переход от сообщения №5 к №6)


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


допустим я вычислил номер элемента который нужно сдвинуть, но как осуществить непосредственно сдвиг чтобы в основной памяти один элемент матрицы стал на место другого?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 




- Текстовая версия 23.05.2018 2:15
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"