From 2935d7ee6cfc482fc753dc976eb09b105d8deec8 Mon Sep 17 00:00:00 2001 From: Ain <41307858+nero@users.noreply.github.com> Date: Sat, 28 Sep 2019 20:38:35 +0000 Subject: [PATCH] Improve emulator --- programs/hello.asm | 6 +++--- utils/emul.c | 31 ++++++++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/programs/hello.asm b/programs/hello.asm index 71ed1b5..ff02195 100644 --- a/programs/hello.asm +++ b/programs/hello.asm @@ -7,11 +7,11 @@ main: test al, al jz .ret mov dl, al - mov ah, 0x02 - int 0x21 + mov cl, 0x02 + call 5 jmp .loop .ret: ret hello: - db "Hello!", 0 + db "Hello!", 0x0A, 0x0D, 0 diff --git a/utils/emul.c b/utils/emul.c index 1b4f2d8..b5e59f2 100644 --- a/utils/emul.c +++ b/utils/emul.c @@ -27,6 +27,7 @@ void* rmptr; #define AL regset.r8[0] #define CL regset.r8[2] #define DL regset.r8[4] +#define AX regset.r16[0] #define BX regset.r16[3] #define SP regset.r16[4] #define BP regset.r16[5] @@ -169,6 +170,13 @@ void step() { modrm(BIT8); RM8 = R8(reg); break; + case 0x8B: // MOV reg16,r/m16 + modrm(BIT16); + R16(reg) = RM16; + break; + case 0xA1: // MOV AX,memoffs16 + AX = *(uint16_t*)&mem[imm16()]; + break; case 0xAC: // LODSB AL = mem[SI]; SI++; @@ -196,7 +204,7 @@ void step() { handle_syscall(CL); } else { push(ip); - ip += reg; + ip = reg; } break; case 0xEB: // JMP rb @@ -214,6 +222,21 @@ void step() { } } +void copy_cmdline(char* str) { + int i, c; + uint8_t *len = &mem[0x80]; + char* ptr = (char*)&mem[0x81]; + c = strlen(str); + // Clip at max length + if (c>0x7E) { + fprintf(stderr, "Command line too long, max is 126 bytes\n"); + exit(1); + } + memcpy(ptr, str, c); + ptr[c]=0x0D; + *len=c; +} + int main(int argc, char** argv) { memset(&mem, sizeof(mem), 0); memset(®set, sizeof(regset), 0); @@ -221,6 +244,12 @@ int main(int argc, char** argv) { mem[1]=0x20; push(0); + if (argc>2) { + copy_cmdline(argv[2]); + } else { + copy_cmdline(""); + } + FILE* fd = fopen(argv[1], "r"); fread(mem + ip, 1, sizeof(mem) - ip, fd); while(1) {