1-3 complete
This commit is contained in:
parent
873159c5ee
commit
53b4945844
5 changed files with 167 additions and 80 deletions
BIN
1-3/8086coded
BIN
1-3/8086coded
Binary file not shown.
|
|
@ -17,6 +17,48 @@
|
|||
/* CMP = 0b111, */
|
||||
/* } ARITHMETIC_OP; */
|
||||
|
||||
typedef enum COND_JMP_OPC
|
||||
{
|
||||
JX = 0b0111,
|
||||
LOOPX = 0b1110'00,
|
||||
|
||||
} JMP_OPC;
|
||||
|
||||
typedef enum LOOPX_INST
|
||||
{
|
||||
LOOP = 0b10,
|
||||
LOOPZ = 0b01,
|
||||
LOOPNZ = 0b00,
|
||||
JCXZ = 0b11
|
||||
} LOOPX_INST;
|
||||
|
||||
#define LOOPX_INST_TXT_LEN 7
|
||||
char LOOPX_INST_TXT[0b100][LOOPX_INST_TXT_LEN] = { "loopnz", "loopz", "loop", "jcxz" };
|
||||
|
||||
typedef enum JX_INST
|
||||
{
|
||||
JZ = 0b0100,
|
||||
JL = 0b1100,
|
||||
JLE = 0b1110,
|
||||
JB = 0b0010,
|
||||
JBE = 0b0110,
|
||||
JP = 0b1010,
|
||||
JO = 0b0000,
|
||||
JS = 0b1000,
|
||||
JNE = 0b0101,
|
||||
JNL = 0b1101,
|
||||
JNLE = 0b1111,
|
||||
JNB = 0b0011,
|
||||
JNBE = 0b0111,
|
||||
JNP = 0b1011,
|
||||
JNO = 0b0001,
|
||||
JNS = 0b1001,
|
||||
} JX_INST;
|
||||
|
||||
#define JX_INST_TXT_LEN 5
|
||||
char JX_INST_TXT[0b10000][JX_INST_TXT_LEN] = { "jo", "jno", "jb", "jnb", "jz", "jne", "jbe", "jnbe",
|
||||
"js", "jns", "jp", "jnp", "jl", "jnl", "jle", "jnle" };
|
||||
|
||||
typedef enum ARITHMETIC_OP
|
||||
{
|
||||
ADD = 0b000,
|
||||
|
|
@ -351,7 +393,7 @@ int16_t calc_effective_disp(uint8_t high_order, uint8_t low_order, bool lo_only)
|
|||
const uint8_t low_order_neg_mask = 0b1000'0000;
|
||||
int16_t effective_disp = 0;
|
||||
|
||||
if (lo_only & ((low_order & low_order_neg_mask) >> 7))
|
||||
if (lo_only && ((low_order & low_order_neg_mask) >> 7))
|
||||
high_order = high_order | 0b1111'1111;
|
||||
int8_t *effective_disp_high_order =(int8_t*) &(effective_disp) + 1;
|
||||
memcpy(&(effective_disp), &low_order, 1);
|
||||
|
|
@ -682,14 +724,14 @@ int ASC_I_RM_parse(uint8_t byte1, uint8_t byte2, binary_data *binary, int bytes_
|
|||
effective_disp = calc_effective_disp(high_disp, low_disp, false);
|
||||
|
||||
low_data = payload[2];
|
||||
if (is_wide)
|
||||
if (is_wide && !is_sign)
|
||||
{
|
||||
high_data = payload[3];
|
||||
effective_data = calc_effective_disp(high_data, low_data, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
effective_data = calc_effective_disp(0, low_disp, true);
|
||||
effective_data = calc_effective_disp(0, low_data, true);
|
||||
}
|
||||
|
||||
fill_ea_string(&mem_data, EA_ENCODING_TXT[ea_table_value], effective_disp);
|
||||
|
|
@ -828,6 +870,23 @@ int ASC_REGM_R_parse(uint8_t byte1, uint8_t byte2, binary_data *binary, int byte
|
|||
return extra_bytes_read;
|
||||
}
|
||||
|
||||
void JMP_parse(uint8_t byte1, uint8_t byte2, binary_data *binary, int bytes_read, JMP_OPC op)
|
||||
{
|
||||
const uint8_t loopx_mask = 0b0000'0011;
|
||||
const uint8_t jx_mask = 0b0000'1111;
|
||||
int8_t disp = 0;
|
||||
memcpy(&disp, &byte2, sizeof(uint8_t));
|
||||
uint8_t jump_op = (op == LOOPX) ? (byte1 & loopx_mask) : (byte1 & jx_mask);
|
||||
|
||||
char nasm_offset[4] = { "\0" };
|
||||
if (!disp) strcpy(nasm_offset, "$+");
|
||||
else strcpy(nasm_offset, "$+2");
|
||||
|
||||
//We have to add +2 to displacement so that NASM can parse displacements correctly
|
||||
printf("%s %s%+d \n", (op == LOOPX) ? LOOPX_INST_TXT[jump_op] : JX_INST_TXT[jump_op], nasm_offset, disp);
|
||||
fprintf(output, "%s %s%+d \n", (op == LOOPX) ? LOOPX_INST_TXT[jump_op] : JX_INST_TXT[jump_op], nasm_offset, disp);
|
||||
}
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
if (argc != 2) return -1;
|
||||
|
|
@ -848,8 +907,9 @@ int main(int argc, char** argv)
|
|||
fread(byte, sizeof(byte), 1, bin.binary);
|
||||
uint8_t manip_inst = (uint8_t)byte[0];
|
||||
uint8_t inst = (uint8_t)byte[0];
|
||||
//First, we check for ASC.
|
||||
//First, we check for ASC or JMPs.
|
||||
manip_inst = (manip_inst >> 1);
|
||||
|
||||
if ((manip_inst & ASC_I_A_M) == ASC_I_A)
|
||||
{
|
||||
if (bytes_read >= bin.size) break;
|
||||
|
|
@ -860,6 +920,15 @@ int main(int argc, char** argv)
|
|||
continue;
|
||||
}
|
||||
manip_inst = (inst >> 2);
|
||||
if (manip_inst == LOOPX)
|
||||
{
|
||||
if (bytes_read >= bin.size) break;
|
||||
fread(byte, sizeof(byte), 1, bin.binary);
|
||||
bytes_read++;
|
||||
inst_byte2 = (uint8_t)byte[0];
|
||||
JMP_parse(inst, inst_byte2, 0, 0, LOOPX);
|
||||
continue;
|
||||
}
|
||||
if ((manip_inst & ASC_REGM_R_M) == ASC_REGM_R)
|
||||
{
|
||||
if (bytes_read >= bin.size) break;
|
||||
|
|
@ -878,6 +947,16 @@ int main(int argc, char** argv)
|
|||
bytes_read += ASC_I_RM_parse(inst, inst_byte2, 0, 0);
|
||||
continue;
|
||||
}
|
||||
manip_inst = (inst >> 4);
|
||||
if (manip_inst == JX)
|
||||
{
|
||||
if (bytes_read >= bin.size) break;
|
||||
fread(byte, sizeof(byte), 1, bin.binary);
|
||||
bytes_read++;
|
||||
inst_byte2 = (uint8_t)byte[0];
|
||||
JMP_parse(inst, inst_byte2, 0, 0, JX);
|
||||
continue;
|
||||
}
|
||||
//Then, we're checking for all MOV except segment registers
|
||||
manip_inst = (inst >> 1);
|
||||
switch (manip_inst)
|
||||
|
|
|
|||
BIN
1-3/listing-41
BIN
1-3/listing-41
Binary file not shown.
|
|
@ -1,26 +1,10 @@
|
|||
; ========================================================================
|
||||
;bits 16
|
||||
;
|
||||
; (C) Copyright 2023 by Molly Rocket, Inc., All Rights Reserved.
|
||||
;
|
||||
; This software is provided 'as-is', without any express or implied
|
||||
; warranty. In no event will the authors be held liable for any damages
|
||||
; arising from the use of this software.
|
||||
;
|
||||
; Please see https://computerenhance.com for further information
|
||||
;
|
||||
; ========================================================================
|
||||
|
||||
; ========================================================================
|
||||
; LISTING 41
|
||||
; ========================================================================
|
||||
|
||||
bits 16
|
||||
|
||||
;add bx, [bx+si]
|
||||
;add bx, [bp]
|
||||
add si, 2
|
||||
add bp, 2
|
||||
add cx, 8
|
||||
;add si, 2
|
||||
;add bp, 2
|
||||
;add cx, 8
|
||||
;add bx, [bp + 0]
|
||||
;add cx, [bx + 2]
|
||||
;add bh, [bp + si + 4]
|
||||
|
|
@ -31,21 +15,20 @@ add cx, 8
|
|||
;add [bx + 2], cx
|
||||
;add [bp + si + 4], bh
|
||||
;add [bp + di + 6], di
|
||||
add byte [bx], 34
|
||||
add word [bp + si + 1000], 29
|
||||
; add ax, [bp]
|
||||
; add al, [bx + si]
|
||||
; add ax, bx
|
||||
add al, ah
|
||||
add ax, 1000
|
||||
add al, -30
|
||||
add al, 9
|
||||
|
||||
;add byte [bx], 34
|
||||
;add word [bp + si + 1000], 29
|
||||
;add ax, [bp]
|
||||
;add al, [bx + si]
|
||||
;add ax, bx
|
||||
;add al, ah
|
||||
;add ax, 1000
|
||||
;add al, -30
|
||||
;add al, 9
|
||||
;sub bx, [bx+si]
|
||||
;sub bx, [bp]
|
||||
sub si, 2
|
||||
sub bp, 2
|
||||
sub cx, 8
|
||||
;sub si, 2
|
||||
;sub bp, 2
|
||||
;sub cx, 8
|
||||
;sub bx, [bp + 0]
|
||||
;sub cx, [bx + 2]
|
||||
;sub bh, [bp + si + 4]
|
||||
|
|
@ -56,21 +39,20 @@ sub cx, 8
|
|||
;sub [bx + 2], cx
|
||||
;sub [bp + si + 4], bh
|
||||
;sub [bp + di + 6], di
|
||||
sub byte [bx], 34
|
||||
sub word [bx + di], 29
|
||||
;sub byte [bx], 34
|
||||
;sub word [bx + di], 29
|
||||
;sub ax, [bp]
|
||||
;sub al, [bx + si]
|
||||
;sub ax, bx
|
||||
;sub al, ah
|
||||
sub ax, 1000
|
||||
sub al, -30
|
||||
sub al, 9
|
||||
|
||||
;sub ax, 1000
|
||||
;sub al, -30
|
||||
;sub al, 9
|
||||
;cmp bx, [bx+si]
|
||||
;cmp bx, [bp]
|
||||
cmp si, 2
|
||||
cmp bp, 2
|
||||
cmp cx, 8
|
||||
;cmp si, 2
|
||||
;cmp bp, 2
|
||||
;cmp cx, 8
|
||||
;cmp bx, [bp + 0]
|
||||
;cmp cx, [bx + 2]
|
||||
;cmp bh, [bp + si + 4]
|
||||
|
|
@ -81,41 +63,41 @@ cmp cx, 8
|
|||
;cmp [bx + 2], cx
|
||||
;cmp [bp + si + 4], bh
|
||||
;cmp [bp + di + 6], di
|
||||
cmp byte [bx], 34
|
||||
cmp word [4834], 29
|
||||
;cmp byte [bx], 34
|
||||
;cmp word [4834], 29
|
||||
;cmp ax, [bp]
|
||||
;cmp al, [bx + si]
|
||||
;cmp ax, bx
|
||||
;cmp al, ah
|
||||
cmp ax, 1000
|
||||
cmp al, -30
|
||||
cmp al, 9
|
||||
;cmp ax, 1000
|
||||
;cmp al, -30
|
||||
;cmp al, 9
|
||||
|
||||
; test_label0:
|
||||
; jnz test_label1
|
||||
; jnz test_label0
|
||||
; test_label1:
|
||||
; jnz test_label0
|
||||
; jnz test_label1
|
||||
;
|
||||
; label:
|
||||
; je label
|
||||
; jl label
|
||||
; jle label
|
||||
; jb label
|
||||
; jbe label
|
||||
; jp label
|
||||
; jo label
|
||||
; js label
|
||||
; jne label
|
||||
; jnl label
|
||||
; jg label
|
||||
; jnb label
|
||||
; ja label
|
||||
; jnp label
|
||||
; jno label
|
||||
; jns label
|
||||
; loop label
|
||||
; loopz label
|
||||
; loopnz label
|
||||
; jcxz label
|
||||
test_label0:
|
||||
jnz test_label1
|
||||
jnz test_label0
|
||||
test_label1:
|
||||
jnz test_label0
|
||||
jnz test_label1
|
||||
|
||||
label:
|
||||
je label
|
||||
jl label
|
||||
jle label
|
||||
jb label
|
||||
jbe label
|
||||
jp label
|
||||
jo label
|
||||
js label
|
||||
jne label
|
||||
jnl label
|
||||
jg label
|
||||
jnb label
|
||||
ja label
|
||||
jnp label
|
||||
jno label
|
||||
jns label
|
||||
loop label
|
||||
loopz label
|
||||
loopnz label
|
||||
jcxz label
|
||||
|
|
|
|||
|
|
@ -0,0 +1,26 @@
|
|||
bits 16
|
||||
|
||||
jne $+2+2
|
||||
jne $+2-4
|
||||
jne $+2-6
|
||||
jne $+2-4
|
||||
jz $+2-2
|
||||
jl $+2-4
|
||||
jle $+2-6
|
||||
jb $+2-8
|
||||
jbe $+2-10
|
||||
jp $+2-12
|
||||
jo $+2-14
|
||||
js $+2-16
|
||||
jne $+2-18
|
||||
jnl $+2-20
|
||||
jnle $+2-22
|
||||
jnb $+2-24
|
||||
jnbe $+2-26
|
||||
jnp $+2-28
|
||||
jno $+2-30
|
||||
jns $+2-32
|
||||
loop $+2-34
|
||||
loopz $+2-36
|
||||
loopnz $+2-38
|
||||
jcxz $+2-40
|
||||
Loading…
Add table
Add a link
Reference in a new issue