Page 11 of 77
Re: Помогите новичку
Posted: Mon Mar 15, 2010 2:24 am
by Gluk
да, так и оказалось =) невнимательность, это все она..
спасибо!
Re: Помогите новичку
Posted: Sun Mar 21, 2010 2:18 am
by Alexus
Мог бы кто-нибудь написать, как использовать __params в колибри, тк по исходникам gifview и imgview этого понять не особо удалось =(, допустим если я хочу вывести эту строку через системный вызов 4.
Re: Помогите новичку
Posted: Sun Mar 21, 2010 9:42 am
by Ghost
там если не изменят память, лежит ASCIIZ строка, функция 4 умеет работать с такими строками.
точнее в params лежит указатель на буфер, а система в этот буфер кладет ACIIZ строку.
Re: Помогите новичку
Posted: Thu Apr 01, 2010 9:15 am
by staper
Имеется смесь *.cpp и *.c файлов. Как объединить все объектники? Ругательства при линковке, относящиеся к *.cpp, вида "x.o:x.cpp: undefined referenced to '_x_y_x' ".
Re: Помогите новичку
Posted: Thu Apr 01, 2010 1:45 pm
by diamond
staper
В .cpp-файлах все внешние функции (как экспортируемые, так и импортируемые) следует помечать как extern "C".
Re: Помогите новичку
Posted: Fri Apr 02, 2010 9:57 am
by staper
Существуют ли обёртки под GCC для libimg.obj? Хотелось бы отрисовать в окне BMP-файл.
Re: Помогите новичку
Posted: Sat Apr 17, 2010 11:24 pm
by IgorA
Переделываю программу под макросы из
proc32.inc возник вопрос. Как вернуть переменную через стек из функции, если используется макрос
proc ?
Code: Select all
proc aaa, bbb:dword
locals
ccc dd ?
endl
.........
ret
endp
Допустим нужно вернуть переменную
ccc ? Без макроса в параметрах
ret можно было задать меньшее число и оно в стеке возвращало переменную, а теперь неясно.
Re: Помогите новичку
Posted: Sat Apr 17, 2010 11:52 pm
by mike.dld
Не знаю ни одного соглашения о вызове, которое предполагало бы то, что ты хочешь. Нужно вернуть что-то не в регистре - предоставь функции (в качестве параметра) адрес буфера, в который она может это записать.
Re: Помогите новичку
Posted: Sun Apr 18, 2010 12:46 am
by Serge
Жуть какая. Определи функцию как cdecl и передай ccc как параметр через стек. Но так поступают только злобные буратины и оптимизирующие компиляторы.
Re: Помогите новичку
Posted: Sun Apr 18, 2010 7:00 pm
by IgorA
Попробую объяснить чего я хочу на примерах:
1) допустим есть функция aaa, принимает параметр bbb и ничего не возвращает по завершении:
Code: Select all
aaa:
push ebp
mov ebp,esp
...
add dword[ebp+8],333 ;bbb+=333
...
pop ebp
ret 4
2) функция aaa, принимает параметр bbb и возвращает по завершении значение bbb+333:
Code: Select all
aaa:
push ebp
mov ebp,esp
...
add dword[ebp+8],333 ;bbb+=333
...
pop ebp
ret ;возвращаем bbb, которое стало равным bbb+333
Теперь те же примеры с макросом proc:
3) функция aaa принимает bbb ничего не возвращает:
Code: Select all
proc aaa, bbb:dword
...
add dword[bbb],333 ;bbb+=333
...
ret
endp
4) функция aaa принимает bbb ничего и возвращает bbb+333:
Code: Select all
proc aaa, bbb:dword
...
add dword[bbb],333 ;bbb+=333
...
ret -4 ;???
endp
Правильно ли я набрал 4-й пример где ret -4 ? Будет ли оно правильно работать ?
Re: Помогите новичку
Posted: Fri May 07, 2010 6:00 pm
by diamond
IgorA
Нет, так работать не будет. Если очень хочется именно этого, можно, например, использовать инструкцию retn (retn - "настоящая" инструкция процессора, ret переопределяется в proc). Естественно, чистить стек при этом придётся руками:
Альтернативные варианты разной степени читабельности для разных ситуаций - переопределить код эпилога для proc:
(вариант 1)
Code: Select all
; somewhere before the code
macro epiloguedef procname,flag,parmbytes,localbytes,reglist
{
if procname eq xxx
leave
retn
else
epiloguedef procname,flag,parmbytes,localbytes,reglist
end if
...
proc xxx ...
...
; ret here will be 'leave/retn'
endp
}
(вариант 2)
Code: Select all
; immediately before proc xxx
macro epiloguedef procname,flag,parmbytes,localbytes,reglist
{
leave
retn
}
proc xxx
...
; ret here will be leave/retn
endp
purge epiloguedef
(вариант 3)
Code: Select all
; somewhere before the code
macro myepilogue procname,flag,parmbytes,localbytes,reglist
{
leave
retn
}
...
; immediately before proc xxx
epilogue@proc equ myepilogue
proc xxx
...
; ret here will be leave/retn
endp
restore epilogue@proc
Re: Помогите новичку
Posted: Fri May 21, 2010 11:10 am
by Rock_maniak_forever
Доброго всем дня.
Занялся выводом несжатых BMP картинок, а точнее пишу макрос, по выводу оных. Я заметил что в некторых 24-х битных BMP картинках, присутствует N-ое кол-во мусора, смотрел в HEX-редактре. Хочу узнать, как автоматически определить кол-во мусора, в несжатых 24-х битных BMP картинках? У меня есть 3 вида картинок: в первой нет мусора, во второй в каждом ряду один байт лишний, а в третьей уже по три байта на ряд лишние. Собственно, их вывод я сделал. Получилсь три макроса на каждый тип, а я хочу чтобы всё в одном.
Re: Помогите новичку
Posted: Fri May 21, 2010 12:59 pm
by IgorA
Rock_maniak_forever wrote:Я заметил что в некторых 24-х битных BMP картинках, присутствует N-ое кол-во мусора, смотрел в HEX-редактре. Хочу узнать, как автоматически определить кол-во мусора, в несжатых 24-х битных BMP картинках?
В bmp картинках в каждая строка пикселей начинается с адреса кратного 4-м байтам, на сколько я понял это для ускорения операций преобразования изображений. Потому мусора всегда будет столько байт, сколько их не хватает до адреса кратного 4-м. Например если ширина 24 битной картинки кратна 4-м пикселями (4,8,12,16,...), то в ней мусора не будет, т. к. width*3(rgb)=число кратное 4-м.
Re: Помогите новичку
Posted: Fri May 21, 2010 1:33 pm
by Mario
http://ru.wikipedia.org/wiki/BMP
А вообще, какой смысл реализовывать код написанный ажно в двух библиотеках под Колибри, исходники которых вполне себе доступны. Имхо лишняя трата времени.
Re: Помогите новичку
Posted: Fri May 21, 2010 1:39 pm
by Rock_maniak_forever
Спасибо за быстрый ответ. Буду разбираться.
Есть ещё вопрос. Как преобразовать 1,4,8, и 16 битные несжатые BMP картинки в 24 бита? Погуглив ничего толком не нашёл, потому как все примеры на наСильниках, а я с ними не дружу. Понял только то, что надо умножать байты битовых картинок, на какое-то число, или сдвигать что-ли, а на какое незнаю.