|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
02.06.2011, 16:17 | #1 |
Новичок
Джуниор
Регистрация: 02.06.2011
Сообщений: 5
|
задача под Masm32
Подскажите пожалуйста, где ошибка, точнее скорее всего она в процедуре печати, но каким образом её исправить, не знаю. Дан массив Z dw 30 DUP(?) нужно последний положительный элемент в нём занулить.
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ ¤¤¤ include \masm32\include\masm32rt.inc ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ ¤¤¤ .data z dw 30 DUP(?) .code start: ; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\ call zapolnenie call pech call main call pech inkey exit ;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ zapolnenie proc cls ;чистим экран mov cx,0 ;инициализируем счётчик .WHILE (cx!=29) ;пускаем цикл пока счётчки не будет равен 0 mov ax,cx ;загружаем в акамулятор счётчик для умножения mov si,16 ;подготавливаем множитель для сдвига mul si ;вычисляем сдвиг mov [z+ax],cx ;заполняем массив inc cx ;инкрементируем счётчик .ENDW ;заканчиваем цикл ret zapolnenie endp ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ ¤¤¤ pech proc mov cx,0 ;инициализируем счётчик .WHILE (cx!=29) ;пускаем цикл пока счётчки не будет равен 0(бежим по масиву) mov ax,cx ;загружаем в акамулятор счётчик для умножения mov si,16 ;подготавливаем множитель для сдвига mul si ;вычисляем сдвиг mov bx,[z+ax] ;закидываем элемент массива в регистр для печати print str$(bx),13,10 ;печатаем элемент inc cx ;инкрементируем счётчик .ENDW ;заканчиваем цикл ret pech endp ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ ¤¤¤ main proc mov cx,0 ;инициализируем счётчик .WHILE (cx!=29) ;пускаем цикл пока счётчки не будет равен 0(бежим по масиву) mov ax,cx ;загружаем в акамулятор счётчик для умножения mov si,16 ;подготавливаем множитель для сдвига mul si ;вычисляем сдвиг .IF ([z+ax]>0) ;если элемент положительный mov bx,ax ;сохраняем индекс(смещение) .ENDIf inc cx ;инкрементируем счётчик .ENDW mov [z+bx],0 ;обнуляем последний положительный элемент за счёт сохранённого сдвига ret main endp ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ ¤¤¤ end start Последний раз редактировалось duk0077; 02.06.2011 в 18:23. |
02.06.2011, 21:07 | #2 | ||
Пользователь
Регистрация: 13.05.2011
Сообщений: 17
|
Цитата:
Регистр ecx необходимо сохранить перед вызовом процедуры, поскольку она его "портит". Цитата:
|
||
02.06.2011, 21:33 | #3 |
Новичок
Джуниор
Регистрация: 02.06.2011
Сообщений: 5
|
|
02.06.2011, 21:38 | #4 |
Пользователь
Регистрация: 13.05.2011
Сообщений: 17
|
С процедурой print я не знаком, но как и некоторые другие процедуры она записывает некоторые данные в регистр ecx, что приводит к тому, что цикл будет выполняться бесконечное количество раз или больше заданного.
Это все можно увидеть в отладчике. |
02.06.2011, 21:43 | #5 |
Новичок
Джуниор
Регистрация: 02.06.2011
Сообщений: 5
|
Огромное спасибо, я просто за масм только вчера вечером сел, и не очень ещё освоился, а не подскажешь, почему могут не работать прерывания?
Исправил евх и сх, всё равно где-то косяк pech proc mov cx,0 ;инициализируем счётчик .WHILE (cx!=29) ;пускаем цикл пока счётчки не будет равен 0(бежим по масиву) mov ax,cx ;загружаем в акамулятор счётчик для умножения mov si,16 ;подготавливаем множитель для сдвига mul si ;вычисляем сдвиг mov ebx,0 mov bx,[z+ax] ;закидываем элемент массива в регистр для печати mov dx,cx print str$(ebx),13,10 ;печатаем элемент mov cx,dx inc cx ;инкрементируем счётчик .ENDW ;заканчиваем цикл ret Последний раз редактировалось duk0077; 02.06.2011 в 21:48. |
02.06.2011, 22:19 | #6 |
Пользователь
Регистрация: 13.05.2011
Сообщений: 17
|
Вот рабочий пример.
Код:
Код:
Последний раз редактировалось HmL; 02.06.2011 в 22:28. |
02.06.2011, 22:24 | #7 |
Новичок
Джуниор
Регистрация: 02.06.2011
Сообщений: 5
|
погоди, а как тогда у тебя смещение по массиву идёт? ну точнее я понимаю что вычисляется смещение add edi, 2, но разве следующая от предыдущей ячейки массива в 2 байтах?
И какой тут смысл несут ксоры? Последний раз редактировалось duk0077; 02.06.2011 в 22:29. |
02.06.2011, 22:40 | #8 | |
Пользователь
Регистрация: 13.05.2011
Сообщений: 17
|
У вас выделяется массив на 30 элементов. Размер каждого элемента будет 2 байта. Следовательно, для доступа к следующему элементу массива необходимо увеличить индекс на 2.
Цитата:
|
|
02.06.2011, 23:04 | #9 |
Новичок
Джуниор
Регистрация: 02.06.2011
Сообщений: 5
|
Спасибо огромное за всё
Последний раз редактировалось duk0077; 03.06.2011 в 17:07. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
борьба c masm32 | Krasi | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 12 | 02.02.2014 05:53 |
MASM32, начало | Delffinn | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 12 | 19.07.2012 19:09 |
Установка MASM32. | Samium | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 1 | 19.07.2012 19:04 |
masm32 | Katya25 | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 1 | 17.05.2011 08:40 |
MASM32 VS MASM | JOFRIF | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 8 | 21.02.2011 06:55 |