![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Новичок
Джуниор
Регистрация: 02.06.2011
Сообщений: 5
|
![]()
Подскажите пожалуйста, где ошибка, точнее скорее всего она в процедуре печати, но каким образом её исправить, не знаю. Дан массив 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. |
![]() |
![]() |
![]() |
#2 | ||
Пользователь
Регистрация: 13.05.2011
Сообщений: 17
|
![]() Цитата:
Регистр ecx необходимо сохранить перед вызовом процедуры, поскольку она его "портит". Цитата:
|
||
![]() |
![]() |
![]() |
#3 |
Новичок
Джуниор
Регистрация: 02.06.2011
Сообщений: 5
|
![]() |
![]() |
![]() |
![]() |
#4 |
Пользователь
Регистрация: 13.05.2011
Сообщений: 17
|
![]()
С процедурой print я не знаком, но как и некоторые другие процедуры она записывает некоторые данные в регистр ecx, что приводит к тому, что цикл будет выполняться бесконечное количество раз или больше заданного.
Это все можно увидеть в отладчике. |
![]() |
![]() |
![]() |
#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. |
![]() |
![]() |
![]() |
#6 |
Пользователь
Регистрация: 13.05.2011
Сообщений: 17
|
![]()
Вот рабочий пример.
Код:
Код:
Последний раз редактировалось HmL; 02.06.2011 в 22:28. |
![]() |
![]() |
![]() |
#7 |
Новичок
Джуниор
Регистрация: 02.06.2011
Сообщений: 5
|
![]()
погоди, а как тогда у тебя смещение по массиву идёт? ну точнее я понимаю что вычисляется смещение add edi, 2, но разве следующая от предыдущей ячейки массива в 2 байтах?
И какой тут смысл несут ксоры? Последний раз редактировалось duk0077; 02.06.2011 в 22:29. |
![]() |
![]() |
![]() |
#8 | |
Пользователь
Регистрация: 13.05.2011
Сообщений: 17
|
![]()
У вас выделяется массив на 30 элементов. Размер каждого элемента будет 2 байта. Следовательно, для доступа к следующему элементу массива необходимо увеличить индекс на 2.
Цитата:
|
|
![]() |
![]() |
![]() |
#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 |