Помогите новичку

Applications development, KoOS API questions
  • Мог бы кто-нибудь написать, как использовать __params в колибри, тк по исходникам gifview и imgview этого понять не особо удалось =(, допустим если я хочу вывести эту строку через системный вызов 4.
  • там если не изменят память, лежит ASCIIZ строка, функция 4 умеет работать с такими строками.

    точнее в params лежит указатель на буфер, а система в этот буфер кладет ACIIZ строку.
  • Имеется смесь *.cpp и *.c файлов. Как объединить все объектники? Ругательства при линковке, относящиеся к *.cpp, вида "x.o:x.cpp: undefined referenced to '_x_y_x' ".
  • staper
    В .cpp-файлах все внешние функции (как экспортируемые, так и импортируемые) следует помечать как extern "C".

    Code: Select all

    extern "C" void x_y_x(void) {...}
    
    Ушёл к умным, знающим и культурным людям.
  • Существуют ли обёртки под GCC для libimg.obj? Хотелось бы отрисовать в окне BMP-файл.
  • Переделываю программу под макросы из proc32.inc возник вопрос. Как вернуть переменную через стек из функции, если используется макрос proc ?

    Code: Select all

    proc aaa, bbb:dword
    locals
      ccc dd ?
    endl
    .........
    ret
    endp
    Допустим нужно вернуть переменную ccc ? Без макроса в параметрах ret можно было задать меньшее число и оно в стеке возвращало переменную, а теперь неясно.
  • Не знаю ни одного соглашения о вызове, которое предполагало бы то, что ты хочешь. Нужно вернуть что-то не в регистре - предоставь функции (в качестве параметра) адрес буфера, в который она может это записать.
    in code we trust
  • Жуть какая. Определи функцию как cdecl и передай ccc как параметр через стек. Но так поступают только злобные буратины и оптимизирующие компиляторы.
  • Попробую объяснить чего я хочу на примерах:
    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 ? Будет ли оно правильно работать ?
  • IgorA
    Нет, так работать не будет. Если очень хочется именно этого, можно, например, использовать инструкцию retn (retn - "настоящая" инструкция процессора, ret переопределяется в proc). Естественно, чистить стек при этом придётся руками:

    Code: Select all

    ...
    leave
    retn
    
    Альтернативные варианты разной степени читабельности для разных ситуаций - переопределить код эпилога для 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
    
    Ушёл к умным, знающим и культурным людям.
  • Доброго всем дня.

    Занялся выводом несжатых BMP картинок, а точнее пишу макрос, по выводу оных. Я заметил что в некторых 24-х битных BMP картинках, присутствует N-ое кол-во мусора, смотрел в HEX-редактре. Хочу узнать, как автоматически определить кол-во мусора, в несжатых 24-х битных BMP картинках? У меня есть 3 вида картинок: в первой нет мусора, во второй в каждом ряду один байт лишний, а в третьей уже по три байта на ряд лишние. Собственно, их вывод я сделал. Получилсь три макроса на каждый тип, а я хочу чтобы всё в одном.
  • Rock_maniak_forever wrote:Я заметил что в некторых 24-х битных BMP картинках, присутствует N-ое кол-во мусора, смотрел в HEX-редактре. Хочу узнать, как автоматически определить кол-во мусора, в несжатых 24-х битных BMP картинках?
    В bmp картинках в каждая строка пикселей начинается с адреса кратного 4-м байтам, на сколько я понял это для ускорения операций преобразования изображений. Потому мусора всегда будет столько байт, сколько их не хватает до адреса кратного 4-м. Например если ширина 24 битной картинки кратна 4-м пикселями (4,8,12,16,...), то в ней мусора не будет, т. к. width*3(rgb)=число кратное 4-м.
  • http://ru.wikipedia.org/wiki/BMP
    А вообще, какой смысл реализовывать код написанный ажно в двух библиотеках под Колибри, исходники которых вполне себе доступны. Имхо лишняя трата времени.
  • Спасибо за быстрый ответ. Буду разбираться.

    Есть ещё вопрос. Как преобразовать 1,4,8, и 16 битные несжатые BMP картинки в 24 бита? Погуглив ничего толком не нашёл, потому как все примеры на наСильниках, а я с ними не дружу. Понял только то, что надо умножать байты битовых картинок, на какое-то число, или сдвигать что-ли, а на какое незнаю.
  • Who is online

    Users browsing this forum: No registered users and 3 guests