Ejemplo n.º 1
0
void	move_cursor_back(t_prompt *prompt)
{
  char	tab[16];
  int	width;
  int	height;
  int	total_count;

  total_count = prompt->size_pwd +
  prompt->size_prompt + prompt->count_pos + (prompt->start_col - 1) +
  size_of_int(prompt->nbr) + size_of_int(prompt-> count_char) + 8;
  width = total_count % prompt->nbcols + 1;
  height = prompt->start_line + total_count / prompt->nbcols;
  fill_tab_caps(tab, height, width);
  write(1, tab, strlen(tab));
}
Ejemplo n.º 2
0
int main(){

printf("hello dude\n");

printf(size_of_int());


return 0;
}
Ejemplo n.º 3
0
void emit_mcode(Mcode *mc, u32 opcode, u32 operand_size, Arg left, Arg right) {

    bool is_simd = IS_SIMD_OPCODE(opcode);
    bool jump_opcode = JUMP_OPCODE(opcode);
    bool set_byte_opcode = SET_BYTE_OPCODE(opcode);
    bool muldiv_opcode = opcode == MUL || opcode == DIV;

    assert(!is_simd || operand_size == DWORD || operand_size == QWORD);
    assert(!jump_opcode || operand_size == BYTE || operand_size == DWORD);
    assert(!set_byte_opcode || operand_size == BYTE);
    assert(!(set_byte_opcode || muldiv_opcode) || left.type == REGISTER || left.type == STACK);
    assert(!jump_opcode || left.type == JUMP);
    assert(jump_opcode || set_byte_opcode || muldiv_opcode || right.type != UNDEFINED);

    u8 multibyte_operands = (operand_size == BYTE) ? 0 : 1;

    if (is_simd) {
        if (operand_size == DWORD)
            add_word(mc, 0x0ff3);
        else if (operand_size == QWORD)
            add_word(mc, 0x0ff2);
    }
    else {
        if (operand_size == WORD)
            add_byte(mc, 0x66);
        else if (operand_size == QWORD)
            add_byte(mc, 0x48);
    }

    if (jump_opcode || set_byte_opcode || muldiv_opcode) {
        if (set_byte_opcode) {
            add_byte(mc, 0x0f);
            add_byte(mc, opcode);
            if (left.type == REGISTER)
                add_byte(mc, REG_ADDRESSING << 6 | left.reg);
            else {
                if (size_of_int(left.offset) == BYTE) {
                    add_byte(mc, BYTE_OFFSET << 6 | left.reg);
                    add_byte(mc, left.offset);
                }
                else {
                    add_byte(mc, DWORD_OFFSET << 6 | left.reg);
                    add_dword(mc, left.offset);
                }
            }
        }
        else if (jump_opcode) {
            if (size_of_int(left.offset) == BYTE) {
                add_byte(mc, opcode);
                add_byte(mc, left.offset - 2);
            }
            else {
                add_byte(mc, 0x0f);
                add_byte(mc, opcode + 0x10);
                add_dword(mc, left.offset - 6);
            }
        }
        else {
            add_byte(mc, 0xf7);
            if (left.type == REGISTER)
                add_byte(mc, REG_ADDRESSING << 6 | opcode << 3 | left.reg);
            else if (left.type == STACK) {
                if (size_of_int(left.offset) == BYTE) {
                    add_byte(mc, BYTE_OFFSET << 6 | opcode << 3 | left.reg);
                    add_byte(mc, left.offset);
                }
                else {
                    add_byte(mc, DWORD_OFFSET << 6 | opcode << 3 | left.reg);
                    add_dword(mc, left.offset);
                }
            }
        }
    }
    else if (left.type == REGISTER && right.type == REGISTER) {
        if (is_simd) {
            add_byte(mc, opcode);
            add_byte(mc, REG_ADDRESSING << 6 | right.reg << 3 | left.reg);
        }
        else {
            add_byte(mc, opcode << 3 | multibyte_operands);
            add_byte(mc, REG_ADDRESSING << 6 | left.reg << 3 | right.reg);
        }
    }
    else if (left.type == REGISTER && right.type == STACK) {
        if (is_simd) {
            assert(opcode == MOVS);
            add_byte(mc, opcode | 0x1);
        }
        else
            add_byte(mc, opcode << 3 | multibyte_operands);
        if (size_of_int(right.offset) == BYTE) {
            add_byte(mc, BYTE_OFFSET << 6 | left.reg << 3 | right.reg);
            add_byte(mc, right.offset);
        }
        else {
            add_byte(mc, DWORD_OFFSET << 6 | left.reg << 3 | right.reg);
            add_dword(mc, right.offset);
        }
    }
    else if (left.type == STACK && right.type == REGISTER) {
        if (is_simd)
            add_byte(mc, opcode);
        else
            add_byte(mc, opcode << 3 | 0x2 | multibyte_operands);
        if (size_of_int(left.offset) == BYTE) {
            add_byte(mc, BYTE_OFFSET << 6 | right.reg << 3 | left.reg);
            add_byte(mc, left.offset);
        }
        else {
            add_byte(mc, DWORD_OFFSET << 6 | right.reg << 3 | left.reg);
            add_dword(mc, left.offset);
        }
    }
    else if (left.type == IMMEDIATE) {

        u8 immediate_size = size_of_int(left.immediate);
        u8 byte_immediate = (immediate_size == BYTE) ? 0x2 : 0x0;

        assert(!is_simd || right.type != REGISTER);
        assert(immediate_size != QWORD || opcode == MOV && right.type == REGISTER);

        if (right.type == REGISTER) {
            if (opcode == MOV) {
                if (operand_size == BYTE)
                    add_byte(mc, 0xb0 | right.reg);
                else
                    add_byte(mc, 0xb8 | right.reg);
            }
            else {
                if (operand_size == BYTE && right.reg == AX)
                    add_byte(mc, 0x04 | opcode << 3 | AX);
                else {
                    add_byte(mc, 0x80 | byte_immediate | multibyte_operands);
                    add_byte(mc, REG_ADDRESSING << 6 | opcode << 3 | right.reg);
                }
            }
        }
        else if (right.type == STACK) {
            u8 opcode_part = 0x0;
            if (opcode == MOV)
                add_byte(mc, 0xc6 | multibyte_operands);
            else {
                opcode_part = opcode << 3;
                if (operand_size == BYTE)
                    add_byte(mc, 0x80);
                else
                    add_byte(mc, 0x80 | byte_immediate | multibyte_operands);
            }
            if (size_of_int(right.offset) == BYTE) {
                add_byte(mc, BYTE_OFFSET << 6 | opcode_part | right.reg);
                add_byte(mc, right.offset);
            }
            else {
                add_byte(mc, DWORD_OFFSET << 6 | opcode_part | right.reg);
                add_dword(mc, right.offset);
            }
        }

        switch ((opcode == MOV) ? operand_size : immediate_size) {
        case BYTE: add_byte(mc, left.immediate); break;
        case WORD: add_word(mc, left.immediate); break;
        case DWORD: add_dword(mc, left.immediate); break;
        case QWORD: add_qword(mc, left.immediate); break;
        }
    }
    else
        assert(false);  /* emit: unhandled arg combo */
}