LINUX.ORG.RU

Сообщения user209

 

sizeof(class A) ?

x86, 32bit, почему sizeof(class A) = 1 ?
(возможно смешно, но тем не менее)

#include <stdio.h>
class A 
{
public: 
  A(); 
 ~A(); 
};
int main(void)
{
   printf("sizeof(class A) = %d \n", sizeof(class A)); 
   printf("sizeof(A) =%d \n", sizeof(A)); 
   printf("sizeof(int)=%d \n", sizeof(int));
  printf("sizeof(void)=%d \n", sizeof(void));
  printf("sizeof(void*)=%d \n", sizeof(void*));
}
$ g++ t.cpp
$ ./a.out 
sizeof(class A) =1 
sizeof(A) =1 
sizeof(int)=4 
sizeof(void)=1 
sizeof(void*)=4 
$

user209
()

GAS, макрос, повторное вхождение

Всем доброго времени суток. Не подскажите, как сделать правильно.
Есть макрос который имеет 2 параметра:
1-идентификатор макроса; 2-передаваемая строчка

Я вынужден указывать в 1-ом параметре значение или символ,
который идентифицирует макрос. В программе таких макросов много.
Приходится вручную отслеживать, неудобно.
Как переложить это на препроцессор GAS ?
перерыл массу документов не могу найти, если не сложно.

макрос:
@;--------------------------------
.macro macro_print_msg NN, msg
b 1f
msg_\NN:
.asciz "\msg"
.align
.byte 13,13,13,13

1:
stmfd r13!, {R0,R2, R5}
ldr R0, =msg_\NN
....

2:
....
cmp r2, #13
bne 2b

ldmfd r13!, {R0,R2, R5}
.endm
@;----------------------------------

в программе вызываю:
macro_print_msg 1, "msg_xx"
macro_print_msg 2, "msg_xx"
...

Хочется в макросе в 'msg_\NN' подставить вместо 'NN'
что-то вроде "MACRO_V=MACRO_V+1"
Но как это сделать не знаю, возможно ли это, если возможно,
подскажите, если не сложно?

user209
()

LD, скрипт линкера ?

Может у кого есть опыт, подскажите пожалуйста,
как собрать 2 загружаемых файла по разным адресам,
адреса указываю в скрипте линковщика в выходных секциях
Мне нужно создать 2 файла:
- один загружать в ROM по адресу 0x00000000 ; rom.elf / rom.bin
- другой загружать в RAM по адресу 0xC0000000 ; ram.elf / ram.bin
Я написал такой скрипт:
ENTRY(_start)
MEMORY {
ROM : ORIGIN = 0x00000000, LENGTH = 4K
RAM : ORIGIN = 0xC0000000, l = 128K
}
SECTIONS
{
.vectors 0x00000000 : AT( 0x00000000)
{
_svectors = . ;
*(.vectors)
_evectors = . ;
} >ROM
.text 0xC0000000: AT( 0xC0000000)
{
_stext = . ;
*(.start)
*(.text)
*(.rodata)
*(.rodata*)
*(.glue_7)
*(.glue_7t)
*(.data)
*(.bss)
_etext = . ;
} >RAM
. = ALIGN(4);
}
.end

При конпиляции создается один файл *.elf, если его дизассемблировать, то
вроде соответствует желаемому.
А как мне теперь этот файл, формата *.elf распилить на 2 файла ?
Я пробовал:
objcopy -j .vectors image.out ROM.elf // копирую секцию '.vectors' в ROM.elf
objcopy -R .vectors image.out RAM.elf // все кроме '.vectors' в RAM.elf
Распиливаются но при создании ROM.bin из ROM.elf, ROM.bin получается 0 длины,
и дизассемблер ROM.elf не содержит assembler кода

Может так вообще делать нельзя ?
Не подскажите как правильно делают такие вещи, что сделал не так, как правильно ?
Подскажите если не сложно.

user209
()

assembler AT&T as, GCC вопросики

Помогите разобраться.

Мне нужно вывести строку на экран из программы на assembler- gas.
строка может меняться - служит для отладки, является параметром.

1. можно ли в коде программы в сегменте .text как то определить
переменную и указать, что эта переменная есть адрес нужной мне строки.

про секцию .data я знаю, но это наверное не то что нужно.

2. Возможно можно определить переменную в секции .bss как массив байт,
но не знаю как потом её инициализировать в тексте программы.


char * p = "нужная строка";
Как это сделать на as ?


.segment .text

.global _start
.code 32

_start:
....
??


.end

Перерыл массу разных программ и доков, пока не нашел,
если не сложно подскажите.

user209
()

RSS подписка на новые темы