void test_write_elf() { asm_p as = &(asm_t){ 0 }; as_new(as); const char* text_ptr = "Hello World!\n"; size_t text_len = strlen(text_ptr); size_t text_vaddr = as_data(as, text_ptr, text_len); as_mov(as, RAX, imm(1)); // wirte as_mov(as, RDI, imm(1)); // stdout as_mov(as, RSI, imm(text_vaddr)); // text ptr as_mov(as, RDX, imm(text_len)); // text len as_syscall(as); as_mov(as, RAX, imm(60)); // exit as_mov(as, RDI, imm(1)); // exit code as_syscall(as); as_save_elf(as, "test_write_elf.elf"); as_destroy(as); char* output = NULL; int status_code = run_and_delete("test_write_elf.elf", "./test_write_elf.elf", &output); st_check_int(status_code, 1); st_check_str(output, text_ptr); free(output); }
void test_write_elf() { asm_p as = &(asm_t){ 0 }; size_t code_vaddr = 4 * 1024 * 1024; size_t data_vaddr = 512 * 1024 * 1024; const char* text_ptr = "Hello World!\n"; size_t text_len = strlen(text_ptr); size_t text_offset = as_data(as, text_ptr, text_len); // mov RAX, 1 // write syscall as_write(as, "0100 000B : 1011 wrrr : %8d", 0, 0, 0b000, 1); // mov RDI, 1 // stdout, RDI = R7 = 0b0111 as_write(as, "0100 000B : 1011 wrrr : %8d", 0, 0, 0b111, 1); // mov RSI, text_vaddr // text_ptr, RSI = R6 = 0b0110 as_write(as, "0100 000B : 1011 wrrr : %32d", 0, 1, 0b110, data_vaddr + text_offset); // mov RDX, text_len // text len, RDX = R2 = 0b0010 as_write(as, "0100 000B : 1011 wrrr : %32d", 0, 1, 0b010, text_len); // syscall as_write(as, "0000 1111 : 0000 0101"); // mov RAX, 60 // exit syscall as_write(as, "0100 000B : 1011 wrrr : %8d", 0, 0, 0b000, 60); // mov RDI, 1 // exit code, RDI = R7 = 0b0111 as_write(as, "0100 000B : 1011 wrrr : %8d", 0, 0, 0b111, 1); // syscall as_write(as, "0000 1111 : 0000 0101"); as_save_elf(as, code_vaddr, data_vaddr, "test_write_elf.elf"); as_free(as); char* output = NULL; int status_code = run_and_delete("test_write_elf.elf", "./test_write_elf.elf", &output); st_check_int(status_code, 1); st_check_str(output, text_ptr); free(output); }
operator Data() { return as_data(); }