![]() |
1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!
![]() ![]() |
![]() |
1147 |
![]()
Сообщение
#1
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 205 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
Объясните пожалуйста как можно выполнить следующее задание: Дана матрица 6х5. Вычеркнуть столбец с заданным номером.
|
мисс_граффити |
![]()
Сообщение
#2
|
![]() просто человек ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 3 641 Пол: Женский Реальное имя: Юлия Репутация: ![]() ![]() ![]() |
На каком этапе выполнения возникают сложности?
Показывай, что уже сделал. Вообще - по сути - надо удалить каждый n-ный элемент (т.е. сдвинуть все, что после него стоит). -------------------- Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения! |
1147 |
![]()
Сообщение
#3
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 205 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
Я вообще не представляю как в компиляторе можно представить матрицу. Задания которые мне приходилось делать были на выполнение арифметических действий (с ассемблером я очень мало знаком)-это не трудно-результат видишь в определенном регистре. А тут нужно как-то сделать целую матрицу, да еще столбец вычеркнуть. Про матрицы я сейчас пытаюсь разобраться, но как вычеркнуть столбец мне вообще не ясно
|
мисс_граффити |
![]()
Сообщение
#4
|
![]() просто человек ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 3 641 Пол: Женский Реальное имя: Юлия Репутация: ![]() ![]() ![]() |
(просьба не придираться - объясняю все упрощенно, упуская некоторые не значимые в данном случае нюансы)
Пишу в предположении, что ты правда хочешь разобраться, а не "лишь бы сдать". Человеку удобно представлять матрицу в виде строк и столбцов: 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 |
![]()
Сообщение
#5
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 205 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
большое спасибо мисс граффити!
|
1147 |
![]()
Сообщение
#6
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 205 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
Задача такая:
Дана матрица 6х5. Вычеркнуть столбец с заданным номером |
Lapp |
![]()
Сообщение
#7
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
Вычеркнуть столбец с заданным номером Как организована память для матрицы? По строкам или по столбцам?-------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
1147 |
![]()
Сообщение
#8
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 205 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
по столбцам
|
Lapp |
![]()
Сообщение
#9
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
по столбцам Ну, тогда все просто. Кусок памяти,начинающийся сразу за вычеркиваемым столбцом и содержащий весь остаток матрицы, двигаешь влево на длину столбца.-------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
1147 |
![]()
Сообщение
#10
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 205 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
мне непонятно только как и где задать номера столбцов матрицы чтобы я мог осуществить сдвиг с такого-то столбца влево
|
Lapp |
![]()
Сообщение
#11
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
как и где задать номера столбцов матрицы Их не надо нигде как-то специально задавать. Просто вычисляешь по ним адрес. Например, адрес начального элемента i-того столбца будет: ci = a + i*lc , где ci - адрес начало i-того столбца, a - адрес начала матрицы, lc - длина столбца. Это при условии, что числа однобайтовые, и нумерация идет с нуля. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
1147 |
![]()
Сообщение
#12
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 205 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
вот у меня кое-что получилось, но неправильно... в методичках насчет операции вычеркивания ничего нет. Делал по образцу примера по обработке массива
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 |
volvo |
![]()
Сообщение
#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
|
1147 |
![]()
Сообщение
#14
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 205 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
у меня Radasm
|
volvo |
![]()
Сообщение
#15
|
Гость ![]() |
RadASM - это среда разработки... Она работает со многими компиляторами: и с MASM-ом и с TASM-ом, FASM и NASM тоже поддерживаются... Вот я и спрашиваю, чем именно из вышеперечисленного ты пользуешься?
Сообщение отредактировано: volvo - |
1147 |
![]()
Сообщение
#16
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 205 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
тогда Masm
Добавлено через 14 мин. masm32 точнее |
volvo |
![]()
Сообщение
#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
|
1147 |
![]()
Сообщение
#18
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 205 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
спасибо, попытаюсь разобраться...
|
Lapp |
![]()
Сообщение
#19
|
|||
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
Добавлено через 3 мин. Всем рекомендую посмотреть, как человек за 40 дней полностью забывает все и начинает по новой (переход от сообщения №5 к №6) -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
|||
1147 |
![]()
Сообщение
#20
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 205 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
допустим я вычислил номер элемента который нужно сдвинуть, но как осуществить непосредственно сдвиг чтобы в основной памяти один элемент матрицы стал на место другого?
|
![]() ![]() |
![]() |
Текстовая версия | 6.04.2025 5:35 |