Пример #1
0
char	*ft_itoa_base(int value, int base)
{
	unsigned int	n;
	int				size;
	char			*p;
	char			*dest;
	char			*char_base;
	
	if (value == 0)
		return ("0");
	char_base = build_base();
	size = memory_needed(value, base);
	n = ((value < 0 ) ? -value : value);
	if (!(dest = malloc(sizeof(*dest) * (size + 1))))
		return (NULL);
	p = dest + size;
	*p-- = '\0';
	while (n > 0)
	{
		*p-- = char_base[n % base];
		n /= base;
	}
	if (value < 0)
		*p = '-';
	return (dest);
}
int main(int argc, char **argv)
{
    struct gdt_desc desc;
    uint64_t qword;
    uint32_t base, limit;

    assert(sizeof(struct gdt_desc) == 8);
    if (argc != 2) {
        printf("%s <gdt descriptor>\n", argv[0]);
        return -1;
    }

    // Copy 64-bit value into the descriptor structure.
    qword = strtoll(argv[1], NULL, 16);
    memcpy(&desc, &qword, sizeof(struct gdt_desc));

    printf("Segment descriptor details\n");
    printf("---------------------------\n");
    // Detect whether or not the descriptor is 64-bit.
    if (desc.fl.l) {
        printf("Mode: Long mode\nType: %s\n",
	    get_descriptor_type(desc.ab.ex));
        printf("Base=0, Limit=ffffffffffffffff\n");
        if (desc.fl.sz) {
            printf("Warning: the flag Size should be unset for long mode!\n");
        }
    } else {
        printf("Mode: %d-bit Protected mode\nType: %s\n", 
	    (desc.fl.sz) ? 32 : 16, get_descriptor_type(desc.ab.ex));
        base = build_base(desc.base_0_15, desc.base_0_15, desc.base_24_31);
        limit = build_limit(desc.limit_0_15, desc.limit_16_19);
	if (desc.fl.gran) {
	    limit = (limit << 12U) + 0xFFF;
	}
        printf("Base=%08x, Limit=%08x\n", base, limit);
    }
    printf("* Access byte:\n");
    dump_access_byte(desc.ab);
    printf("* Flags:\n");
    dump_flags(desc.fl);

    return 0;
}