about summary refs log tree commit diff stats
path: root/html/064list.mu.html
Commit message (Expand)AuthorAgeFilesLines
* 4239Kartik Agaram2018-05-081-5/+5
* 4200Kartik K. Agaram2018-01-271-106/+106
* 4199Kartik K. Agaram2018-01-251-195/+194
* 4165Kartik K. Agaram2017-12-271-4/+4
* 4161Kartik K. Agaram2017-12-151-6/+6
* 4134 - 'input' = 'ingredient'Kartik K. Agaram2017-12-031-12/+12
* 4008Kartik K. Agaram2017-09-251-355/+354
* 4003Kartik K. Agaram2017-09-231-5/+5
* 3901Kartik K. Agaram2017-06-091-2/+2
* 3895Kartik K. Agaram2017-05-291-34/+34
* 3883Kartik K. Agaram2017-05-271-62/+75
* 3837Kartik K. Agaram2017-04-191-2/+2
* 3830 - crosslink shape-shifting containers in htmlKartik K. Agaram2017-04-181-73/+73
* 3829Kartik K. Agaram2017-04-181-5/+5
* 3808 - 'length' for duplex listsKartik K. Agaram2017-03-311-295/+298
* 3764 - better colors for cross-linksKartik K. Agaram2017-03-081-3/+4
* 3761Kartik K. Agaram2017-03-071-128/+129
* 3716Kartik K. Agaram2016-12-261-0/+2
* 3713 - cross-link calls with definitions in htmlKartik K. Agaram2016-12-261-50/+50
* 3710Kartik K. Agaram2016-12-261-351/+351
* 3709 - line numbers in htmlKartik K. Agaram2016-12-261-354/+378
* 3667Kartik K. Agaram2016-11-111-2/+2
* 3569Kartik K. Agaram2016-10-231-160/+160
* 3524Kartik K. Agaram2016-10-201-4/+5
* 3431Kartik K. Agaram2016-09-301-5/+5
* 3430Kartik K. Agaram2016-09-281-34/+45
* 3420Kartik K. Agaram2016-09-271-0/+28
* 3395Kartik K. Agaram2016-09-171-66/+66
* 3355Kartik K. Agaram2016-09-151-2/+2
* 3102Kartik K. Agaram2016-07-051-0/+349
diate " e8 a0 00 00 00 \n" // call function offset at 0xa0 // next EIP is 6 ); CHECK_TRACE_CONTENTS( "run: call imm32 0x000000a0\n" "run: decrementing ESP to 0xbd000060\n" "run: pushing value 0x00000006\n" "run: jumping to 0x000000a6\n" ); } :(before "End Single-Byte Opcodes") case 0xe8: { // call disp32 relative to next EIP const int32_t offset = next32(); ++Callstack_depth; trace(Callstack_depth+1, "run") << "call imm32 0x" << HEXWORD << offset << end(); //? cerr << "push: EIP: " << EIP << " => " << Reg[ESP].u << '\n'; push(EIP); EIP += offset; trace(Callstack_depth+1, "run") << "jumping to 0x" << HEXWORD << EIP << end(); break; } //: :(code) void test_call_r32() { Mem.push_back(vma(0xbd000000)); // manually allocate memory Reg[ESP].u = 0xbd000064; Reg[EBX].u = 0x000000a0; run( "== code 0x1\n" // op ModR/M SIB displacement immediate " ff d3 \n" // call function offset at EBX // next EIP is 3 ); CHECK_TRACE_CONTENTS( "run: call to r/m32\n" "run: r/m32 is EBX\n" "run: decrementing ESP to 0xbd000060\n" "run: pushing value 0x00000003\n" "run: jumping to 0x000000a0\n" ); } :(before "End Op ff Subops") case 2: { // call function pointer at r/m32 trace(Callstack_depth+1, "run") << "call to r/m32" << end(); const int32_t* offset = effective_address(modrm); push(EIP); EIP = *offset; trace(Callstack_depth+1, "run") << "jumping to 0x" << HEXWORD << EIP << end(); ++Callstack_depth; break; } :(code) void test_call_mem_at_rm32() { Mem.push_back(vma(0xbd000000)); // manually allocate memory Reg[ESP].u = 0xbd000064; Reg[EBX].u = 0x2000; run( "== code 0x1\n" // op ModR/M SIB displacement immediate " ff 13 \n" // call function offset at *EBX // next EIP is 3 "== data 0x2000\n" "a0 00 00 00\n" // 0xa0 ); CHECK_TRACE_CONTENTS( "run: call to r/m32\n" "run: effective address is 0x00002000 (EBX)\n" "run: decrementing ESP to 0xbd000060\n" "run: pushing value 0x00000003\n" "run: jumping to 0x000000a0\n" ); } //:: ret :(before "End Initialize Op Names") put_new(Name, "c3", "return from most recent unfinished call (ret)"); :(code) void test_ret() { Mem.push_back(vma(0xbd000000)); // manually allocate memory Reg[ESP].u = 0xbd000064; write_mem_u32(Reg[ESP].u, 0x10); run( "== code 0x1\n" // op ModR/M SIB displacement immediate " c3 \n" // return "== data 0x2000\n" "10 00 00 00\n" // 0x10 ); CHECK_TRACE_CONTENTS( "run: return\n" "run: popping value 0x00000010\n" "run: jumping to 0x00000010\n" ); } :(before "End Single-Byte Opcodes") case 0xc3: { // return from a call trace(Callstack_depth+1, "run") << "return" << end(); --Callstack_depth; EIP = pop(); trace(Callstack_depth+1, "run") << "jumping to 0x" << HEXWORD << EIP << end(); break; }