при компиляции флаг из реестра не удаляется. В чем может быть проблема?
Байты из зеленой области, как я понял, это информация линкера golink. Так ли это?
int **matrix = (int**)malloc(matrix_size * sizeof(int));
int **matrix = (int**)malloc(matrix_size * sizeof(int *));
for (int i = 0; i < matrix_size; ++i) { for (int j = 0; j < matrix_size; ++j) { if(i > j) { arr[i] = matrix[i][j]; } } }
counter = 0;
for (int i = 0; i < matrix_size; ++i)
{
for (int j = 0; j < matrix_size; ++j)
{
if(i > j)
{
arr[counter++] = matrix[i][j];
}
}
}
ума не приложу, почему размер void _stdcall foo(short a, short b); параметров равен 8
Как выяснилось, стек растет не только на 4 байта, а на 2.
sub $imm, %esp
) не означает, что это следует делать. См: The stack will always be maintained 16-byte aligned, except within
the prolog (for example, after the return address is pushed), and except where
indicated in Function Types for a certain class of frame functions
Для венды на x86 я такого описания на том же сайте не нашёл, но точно выравнивание должно быть не меньше 4. есть ли смысл использовать простые чар массивы формата char name[32] или динамические массивы char name[] в замену указателям с последующим выделением им памяти?
Сразу скажу, комп у меня слабенький и ждать 3-4 часа чтоб понять что забыл в конце оператора точку с запятой поставить, это не хорошо?!
*.o
. Т.е. можно взять и откомпилировать один файл из дерева исходников ядра. Например: make init/main.o
..c
-- перекомпилируется единственный соответствующий ему файл .o
.как можно тестировать компоненты ядра
пытаюсь понять, почему qemu не хочет запускать ядро....
MAGIC equ 0x1BADB002
...
grubBoot:
dd MAGIC
dd FLAGS
; dd 0
dd (end_grubBoot - grubBoot)
dd -(MAGIC + FLAGS + (end_grubBoot - grubBoot))
; dd -(MAGIC + 0 + (end_grubBoot - grubBoot))
; dw 0
; dw FLAGS
; dd 8
end_grubBoot:
MAGIC equ 0x1BADB002
dd MAGIC
dd FLAGS
dd -(MAGIC + FLAGS)
...
Trace 0: 0x7f2a71e084c0 [00000000/000caa1a/0xb0]
----------------
IN:
0x00102060: 9b wait
0x00102061: db e3 fninit
0x00102063: bc 44 23 10 00 movl $0x102344, %esp
0x00102068: 53 pushl %ebx
0x00102069: 50 pushl %eax
0x0010206a: e8 68 00 00 00 calll 0x1020d7
Trace 0: 0x7f2a71e08800 [00000000/00102060/0xb0]
----------------
IN:
0x001020d7: 55 pushl %ebp
0x001020d8: 89 e5 movl %esp, %ebp
0x001020da: 68 00 10 10 00 pushl $0x101000
0x001020df: e8 8d ff ff ff calll 0x102071
Linking TBs 0x7f2a71e08800 [00102060] index 0 -> 0x7f2a71e08a40 [001020d7]
Trace 0: 0x7f2a71e08a40 [00000000/001020d7/0xb0]
----------------
IN:
0x00102071: 55 pushl %ebp
0x00102072: 89 e5 movl %esp, %ebp
0x00102074: 53 pushl %ebx
0x00102075: 83 ec 10 subl $0x10, %esp
0x00102078: c7 45 f4 00 80 0b 00 movl $0xb8000, -0xc(%ebp)
0x0010207f: c7 45 f8 00 00 00 00 movl $0, -8(%ebp)
0x00102086: eb 35 jmp 0x1020bd
Linking TBs 0x7f2a71e08a40 [001020d7] index 0 -> 0x7f2a71e08c80 [00102071]
Trace 0: 0x7f2a71e08c80 [00000000/00102071/0xb0]
----------------
IN:
0x001020bd: 8b 55 f8 movl -8(%ebp), %edx
0x001020c0: 8b 45 08 movl 8(%ebp), %eax
0x001020c3: 01 d0 addl %edx, %eax
0x001020c5: 0f b6 00 movzbl (%eax), %eax
0x001020c8: 0f be c0 movsbl %al, %eax
0x001020cb: 3b 45 f8 cmpl -8(%ebp), %eax
0x001020ce: 7f b8 jg 0x102088
Linking TBs 0x7f2a71e08c80 [00102071] index 0 -> 0x7f2a71e08f00 [001020bd]
Trace 0: 0x7f2a71e08f00 [00000000/001020bd/0xb0]
----------------
IN:
0x00102088: 8b 45 f8 movl -8(%ebp), %eax
0x0010208b: 8d 14 00 leal (%eax, %eax), %edx
0x0010208e: 8b 45 f4 movl -0xc(%ebp), %eax
0x00102091: 01 d0 addl %edx, %eax
0x00102093: 8b 55 f8 movl -8(%ebp), %edx
0x00102096: 8d 0c 12 leal (%edx, %edx), %ecx
0x00102099: 8b 55 f4 movl -0xc(%ebp), %edx
0x0010209c: 01 ca addl %ecx, %edx
0x0010209e: 0f b7 12 movzwl (%edx), %edx
0x001020a1: 89 d3 movl %edx, %ebx
0x001020a3: b3 00 movb $0, %bl
0x001020a5: 8b 4d f8 movl -8(%ebp), %ecx
0x001020a8: 8b 55 08 movl 8(%ebp), %edx
0x001020ab: 01 ca addl %ecx, %edx
0x001020ad: 0f b6 12 movzbl (%edx), %edx
0x001020b0: 66 0f be d2 movsbw %dl, %dx
0x001020b4: 09 da orl %ebx, %edx
0x001020b6: 66 89 10 movw %dx, (%eax)
0x001020b9: 83 45 f8 01 addl $1, -8(%ebp)
0x001020bd: 8b 55 f8 movl -8(%ebp), %edx
0x001020c0: 8b 45 08 movl 8(%ebp), %eax
0x001020c3: 01 d0 addl %edx, %eax
0x001020c5: 0f b6 00 movzbl (%eax), %eax
0x001020c8: 0f be c0 movsbl %al, %eax
0x001020cb: 3b 45 f8 cmpl -8(%ebp), %eax
0x001020ce: 7f b8 jg 0x102088
Linking TBs 0x7f2a71e08f00 [001020bd] index 1 -> 0x7f2a71e091c0 [00102088]
Trace 0: 0x7f2a71e091c0 [00000000/00102088/0xb0]
Linking TBs 0x7f2a71e091c0 [00102088] index 1 -> 0x7f2a71e091c0 [00102088]
Trace 0: 0x7f2a71e091c0 [00000000/00102088/0xb0]
----------------
IN:
0x001020d0: 90 nop
0x001020d1: 83 c4 10 addl $0x10, %esp
0x001020d4: 5b popl %ebx
0x001020d5: 5d popl %ebp
0x001020d6: c3 retl
Linking TBs 0x7f2a71e091c0 [00102088] index 0 -> 0x7f2a71e098c0 [001020d0]
Trace 0: 0x7f2a71e098c0 [00000000/001020d0/0xb0]
----------------
IN:
0x001020e4: 83 c4 04 addl $4, %esp
0x001020e7: eb fe jmp 0x1020e7
Trace 0: 0x7f2a71e09b00 [00000000/001020e4/0xb0]
----------------
IN:
0x001020e7: eb fe jmp 0x1020e7
Linking TBs 0x7f2a71e09b00 [001020e4] index 0 -> 0x7f2a71e09c40 [001020e7]
Trace 0: 0x7f2a71e09c40 [00000000/001020e7/0xb0]
Linking TBs 0x7f2a71e09c40 [001020e7] index 0 -> 0x7f2a71e09c40 [001020e7]
...
LDEMU=-melf_i386
kernel: $(CSOURCES) $(NASMSOURCES) $(LDFILE)
$(CC) $(CEMU) -std=c$(CSTD) -c $(CSOURCES) -ffreestanding -nostdlib -nostdinc -fno-pic
$(ASM) $(NASMSOURCES)
$(LD) $(LDEMU) --nmagic -T$(LDFILE) -o kernel *.o
При компиляции выдает ошибку
struct SYM* buildTree(struct SYM *psym[], int N) ... void division(struct alphabet *alphabetLetter, int groupCount) { int psysms[256]; ... psysms[i] = &alphabetLetter[i]; ... struct SYM *root = buildTree(psysms, alphabetLen); ... }
e.data.fd = cfd; e.data.ptr = (void*)cfd;
typedef union epoll_data {
void *ptr;
int fd;
uint32_t u32;
uint64_t u64;
} epoll_data_t;
struct epoll_event {
uint32_t events; /* Epoll events */
epoll_data_t data; /* User data variable */
};
в документации сказано, что там должен быть дескриптор серверного сокета
l=[a_1,..,a_n] – некоторый список элементов типа T, а f:T→T, то:
map(f,l)↦[f(a_1 ),..,f(a_n )]
Не понятно что она делает и как ее реализовать.
#include <stddef.h>
struct list {
struct list *next;
};
struct list *map(void f(struct list *p), struct list *l)
{
struct list *i;
for (i = l; i != NULL; i = i->next)
f(i);
return l;
}
struct list_int {
struct list list;
int i;
};
void process_int(struct list *l)
{
struct list_int *p = (struct list_int *)l;
++p->i;
}
int main()
{
struct list_int l[] = {
[0] = {
.list.next = &l[1].list,
.i = 1,
},
[1] = {
.i = 2,
},
};
map(process_int, &l[0].list);
}
Из за чего это ?
offsetof(struct my_struct_in, addr)
чтобы в этом убедиться.uint32_t addr
, если имелся в виду IP адрес). Паковать структуры (если выравнять нельзя), либо располагать поля согласно их натуральному выравниванию. Как на Си вывести флаги в том же формате, что делает команда objdump?
static void
dump_bfd_header (bfd *abfd)
{
char *comma = "";
printf (_("architecture: %s, "),
bfd_printable_arch_mach (bfd_get_arch (abfd),
bfd_get_mach (abfd)));
printf (_("flags 0x%08x:\n"), abfd->flags & ~BFD_FLAGS_FOR_BFD_USE_MASK);
#define PF(x, y) if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
PF (HAS_RELOC, "HAS_RELOC");
PF (EXEC_P, "EXEC_P");
PF (HAS_LINENO, "HAS_LINENO");
PF (HAS_DEBUG, "HAS_DEBUG");
PF (HAS_SYMS, "HAS_SYMS");
PF (HAS_LOCALS, "HAS_LOCALS");
PF (DYNAMIC, "DYNAMIC");
PF (WP_TEXT, "WP_TEXT");
PF (D_PAGED, "D_PAGED");
PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE");
printf (_("\nstart address 0x"));
bfd_printf_vma (abfd, abfd->start_address);
printf ("\n");
}
void get_disks(char * allDisks[]) { char buf[128]; ... for (char *s = buf; *s; s += strlen(s) + 1) { ... allDisks[i] = s; ... allDisks[7] = "ABC"; allDisks[8] = "DEF"; } }
После прохождения массива функцией get_files список дисков исчезает, но "ABC" и "DEF" остаются.
Подскажите, почему так происходит, куда теряются первые строки и как исправить?
allDisks
указатели на стековый массив buf
, который разрушается после выхода из функции get_disks
. А строчки "ABC" и "DEF" -- константные строчки, существуют всё время выполнения программы.allDisks
:void get_disks(char * allDisks[])
{
char buf[128];
int i = 0;
GetLogicalDriveStringsA(sizeof(buf), buf);
for (char *s = buf; *s; s += strlen(s) + 1)
{
if (GetDriveTypeA(s) == 2 || GetDriveTypeA(s) == 3)
{
allDisks[i] = strdup(s);
++i;
allDisks[7] = "ABC";
allDisks[8] = "DEF";
}
}
}
почему я неправильно ссылаюсь к указателю в структуре?zmienna_strukt.a=NULL; ... scanf("%s", wsk->a);
struct morgan zmienna_strukt;
struct morgan *wsk;
unsigned char buf[100];
wsk=&zmienna_strukt;
printf("Впиши значение: ");
fflush(stdout);
scanf("%d", &zmienna_strukt.b);
printf("%d \n\n", zmienna_strukt.b);
zmienna_strukt.a=buf;
buf[0] = 0;
printf("%s \n\n", zmienna_strukt.a);
printf("Впиши значение: ");
fflush(stdout);
scanf("%s", wsk->a);
printf("%s \n\n", wsk->a);
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static int cmp_min(const void *a, const void *b)
{
int va = *(const char *)a;
int vb = *(const char *)b;
return va - vb;
}
static int minimize(int v)
{
char str[sizeof(int) * 3 + 1];
int i;
sprintf(str, "%d", v);
qsort(str, strlen(str), 1, cmp_min);
if (str[0] == '0') {
for (i = 0; str[i]; ++i) {
if (str[i] != '0') {
str[0] = str[i];
str[i] = '0';
break;
}
}
}
sscanf(str, "%i", &v);
return v;
}
static int cmp_max(const void *a, const void *b)
{
int va = *(const char *)a;
int vb = *(const char *)b;
return vb - va;
}
static int maximize(int v)
{
char str[sizeof(int) * 3 + 1];
sprintf(str, "%d", v);
qsort(str, strlen(str), 1, cmp_max);
sscanf(str, "%i", &v);
return v;
}
int main()
{
int a, b;
int result_a, result_b;
scanf("%i %i", &a, &b);
result_a = a < 0 ? -minimize(-a) : maximize(a);
result_b = b < 0 ? -maximize(-b) : minimize(b);
printf("%d\n", result_a - result_b);
return 0;
}