Объясните пожалуйста как можно выполнить следующее задание: Дана матрица 6х5. Вычеркнуть столбец с заданным номером.
мисс_граффити
8.09.2008 20:52
На каком этапе выполнения возникают сложности? Показывай, что уже сделал.
Вообще - по сути - надо удалить каждый n-ный элемент (т.е. сдвинуть все, что после него стоит).
1147
8.09.2008 21:09
Я вообще не представляю как в компиляторе можно представить матрицу. Задания которые мне приходилось делать были на выполнение арифметических действий (с ассемблером я очень мало знаком)-это не трудно-результат видишь в определенном регистре. А тут нужно как-то сделать целую матрицу, да еще столбец вычеркнуть. Про матрицы я сейчас пытаюсь разобраться, но как вычеркнуть столбец мне вообще не ясно
мисс_граффити
9.09.2008 1:19
(просьба не придираться - объясняю все упрощенно, упуская некоторые не значимые в данном случае нюансы) Пишу в предположении, что ты правда хочешь разобраться, а не "лишь бы сдать". Человеку удобно представлять матрицу в виде строк и столбцов: 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
попробуй для начала разобраться в этом. Возникнут вопросы - пиши...
1147
9.09.2008 13:31
большое спасибо мисс граффити!
1147
19.10.2008 18:25
Задача такая: Дана матрица 6х5. Вычеркнуть столбец с заданным номером
Lapp
19.10.2008 22:55
Цитата(1147 @ 19.10.2008 14:25)
Вычеркнуть столбец с заданным номером
Как организована память для матрицы? По строкам или по столбцам?
1147
20.10.2008 4:44
по столбцам
Lapp
20.10.2008 6:50
Цитата(1147 @ 20.10.2008 0:44)
по столбцам
Ну, тогда все просто. Кусок памяти,начинающийся сразу за вычеркиваемым столбцом и содержащий весь остаток матрицы, двигаешь влево на длину столбца.
1147
20.10.2008 15:49
мне непонятно только как и где задать номера столбцов матрицы чтобы я мог осуществить сдвиг с такого-то столбца влево
Lapp
21.10.2008 4:09
Цитата(1147 @ 20.10.2008 11:49)
как и где задать номера столбцов матрицы
Их не надо нигде как-то специально задавать. Просто вычисляешь по ним адрес. Например, адрес начального элемента i-того столбца будет: ci = a + i*lc , где ci - адрес начало i-того столбца, a - адрес начала матрицы, lc - длина столбца. Это при условии, что числа однобайтовые, и нумерация идет с нуля.
1147
22.10.2008 1:46
вот у меня кое-что получилось, но неправильно... в методичках насчет операции вычеркивания ничего нет. Делал по образцу примера по обработке массива
Start: mov DI,0 mov ECX,2; номер вычеркиваемого столбца
RadASM - это среда разработки... Она работает со многими компиляторами: и с MASM-ом и с TASM-ом, FASM и NASM тоже поддерживаются... Вот я и спрашиваю, чем именно из вышеперечисленного ты пользуешься?
1147
26.10.2008 2:12
тогда Masm
Добавлено через 14 мин. masm32 точнее
volvo
26.10.2008 16:04
Ну, а 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
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
1147
27.10.2008 15:08
спасибо, попытаюсь разобраться...
Lapp
30.10.2008 7:51
М
1147, почему надо было создавать две одинаковые темы?? Чтобы модераторы не скучали?.. Объединяю темы. Руки чешутся закрыть, но боюсь, появится еще одна..
Добавлено через 3 мин. Всем рекомендую посмотреть, как человек за 40 дней полностью забывает все и начинает по новой (переход от сообщения №5 к №6)
1147
2.11.2008 22:12
допустим я вычислил номер элемента который нужно сдвинуть, но как осуществить непосредственно сдвиг чтобы в основной памяти один элемент матрицы стал на место другого?
volvo
2.11.2008 22:34
Цитата
как осуществить непосредственно сдвиг чтобы в основной памяти один элемент матрицы стал на место другого?
В esi - адрес ячейки, откуда перемещать, в edi - адрес ячейки куда перемещать. В ecx - количество элементов для перемещения... И вызываешь REP MOVSB для байт, REP MOVSW для слов, или REP MOVSD для двойных слов...
Я ж тебе привел пример, как это делается... Ты его смотрел вообще?
1147
2.11.2008 23:05
смотрел разумеется. Но как-то там слишком много всего написано. Мне в институте преподаватель сказал что это делается гораздо проще. С помощью двух циклов-внутренний по строкам, внешний по столбцам
Добавлено через 10 мин. Вот к примеру, самы простой вариант. Дан одномерный массив: 1,3,2,4,7,3. нужно удалить цифру 2 (тоесть сдвинуть 4,7,3 влево). какие адреса нужно указывать в ES и EDI?
Добавлено через 48 сек. ESI и EDI
volvo
3.11.2008 0:29
Цитата
как-то там слишком много всего написано. Мне в институте преподаватель сказал что это делается гораздо проще. С помощью двух циклов-внутренний по строкам, внешний по столбцам
С твоим преподавателем в принципе все понятно... "Легче", конечно, сделать 2 цикла, вместо того одного, который сейчас у меня... А на MASM32 он что, распечатать матрицу (именно для этого используются у меня еще 2 цикла) может одним вызовом? Флаг ему в руки, пусть вызывает... Больше не получишь полных решений, буду приводить только тот кусок, который реализует задание... Вот:
Цитата
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 ; Один единственный цикл, больше никаких циклов нигде нет...
Все остальное к заданию напрямую не относится... Жду более "легкого" решения...
Цитата
Дан одномерный массив: 1,3,2,4,7,3. нужно удалить цифру 2 (тоесть сдвинуть 4,7,3 влево). какие адреса нужно указывать в ES и EDI?
Какое ЭТО имеет отношение к теме? Это не удаление столбца в матрице, записанной ПО СТОЛБЦАМ. Это удаление столбца в матрице, записанной ПО СТРОКАМ. Разницу замечаешь? Надо было говорить сразу, что тебе нужно... Тем более, тебя еще и переспросили... В ESI - адрес "четверки", в EDI - адрес "двойки". Типы данных ты не привел, поэтому смещения от начала массива высчитывай сам... Удачи...
1147
3.11.2008 1:35
Жду более "легкого" решения...
как сделаю, обязательно выложу
Гость
18.11.2008 16:41
Более легкое решение:
;Дана матрица 6х5. Вычеркнуть столбец с заданным номером.
.DATA A dw 1,3,7,2,4 dw 9,1,3,5,6 dw 2,9,7,4,1 dw 8,2,5,3,7 dw 6,2,7,4,3 dw 5,9,3,5,1 .DATA? inbuf DB 100 DUP (?)
.CODE
Start:
mov ecx,4; здесь задаем номер вычеркиваемого столбца (от 1 до 5) mov edi,ecx cycl0: inc edi loop cycl0 mov ebx,0 mov ax,A mov ecx,4
блин это не гость. Это я выложил более легкое решение как и обещал. забыл войти просто
volvo
18.11.2008 19:46
Цитата
Это я выложил более легкое решение как и обещал
Угу... Настолько легкое, что компилировать его MASM 6.14 напрочь отказался... Хотя правильно. Оно же легкое, чтобы оно было работоспособным - это совсем не обязательно, об этом речи не шло...
А после "допиливания" твоей "программы" (почему ту программу, которая приведена в 17-ом посте не надо ни дорабатывать, ни исправлять ошибки, ничего, можно сразу проверить, а твою - нельзя?) она компилируется, но при запуске хочет сразу отправить письмо Биллу Гейтсу. Это ее основная функциональность?
1147
19.11.2008 21:27
ее основная функциональность-удалять заданный столбец. У меня она работает без малейших ошибок. Более того, вчера в институте у меня ее приняли и защитали. Единственный недостаток-много лишних циклов. Ее можно было свести к 2м циклам, как я и говорил раньше. Тогда было бы еще проще
Добавлено через 7 мин. и в допиливании и исправлении "ошибок" она нисколько не нуждается, разве только с целью отправки письма Биллу Гейтсу
1147
19.11.2008 21:55
кроме того программа написана в masm32, с использованием 32х разрядных регистров. Я бы сильно удивился если бы она правильно работала в masm 6.14
Гость
1.05.2013 19:29
Нужно с клавиатуры ввести предложение а после заменить в предложении символ "а"(или другой), на символ "о"
Гость
1.05.2013 19:31
[quote name='Гость' date='1.05.2013 15:29' post='162058'] Нужно с клавиатуры ввести предложение а после заменить в предложении символ "а"(или другой), на символ "о" Желательно на 32 и 16 бит в TASMe
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.