1-2 challenge solved (only impl in RM_TF_R)

This commit is contained in:
Hane 2026-01-27 15:45:42 +01:00
commit 372364971c
7 changed files with 68 additions and 53 deletions

Binary file not shown.

View file

@ -160,10 +160,20 @@ void fill_ea_string(output_string *str, char* content, int16_t displacement)
{ {
if (strlen(content) > 0) if (strlen(content) > 0)
{ {
memcpy(str->string, " + ", 3); *(str->string) = ' ';
if(displacement >= 0)
{
*(str->string + 1) = '+';
*(str->string + 2) = ' ';
str->string += 3; str->string += 3;
str->len += 3; str->len += 3;
} }
else
{
str->string += 1;
str->len += 1;
}
}
disp_len = sprintf(str->string, "%d", displacement); disp_len = sprintf(str->string, "%d", displacement);
str->string += disp_len; str->string += disp_len;
str->len += disp_len; str->len += disp_len;
@ -297,10 +307,22 @@ int MOV_I_T_RM_parse(uint8_t byte1, uint8_t byte2, binary_data *binary, int byte
break; break;
} }
return extra_bytes_read; return extra_bytes_read;
} }
int16_t calc_effective_disp(uint8_t high_order, uint8_t low_order)
{
const uint8_t low_order_neg_mask = 0b1000'0000;
int16_t effective_disp = 0;
if (high_order == 0 & ((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);
memcpy(effective_disp_high_order, &high_order, 1);
return effective_disp;
}
int MOV_RM_TF_R_parse(uint8_t byte1, uint8_t byte2, binary_data *binary, int bytes_read) int MOV_RM_TF_R_parse(uint8_t byte1, uint8_t byte2, binary_data *binary, int bytes_read)
{ {
const uint8_t wide_mask = 0b0000'0001; const uint8_t wide_mask = 0b0000'0001;
@ -312,8 +334,13 @@ int MOV_RM_TF_R_parse(uint8_t byte1, uint8_t byte2, binary_data *binary, int byt
uint8_t low_disp = 0; uint8_t low_disp = 0;
uint8_t high_disp = 0; uint8_t high_disp = 0;
uint16_t wide_disp = 0; uint16_t wide_disp = 0;
int16_t effective_disp = 0;
uint8_t extra_bytes_read = 0; uint8_t extra_bytes_read = 0;
output_string mem_data;
mem_data.len = 0;
mem_data.string = calloc(18, sizeof(char)); //"[bp + di + 65535]\0"
bool reg_is_dest = (byte1 & dest_mask); bool reg_is_dest = (byte1 & dest_mask);
uint8_t inst_mod = (byte2 & mod_mask) >> 6; uint8_t inst_mod = (byte2 & mod_mask) >> 6;
@ -342,28 +369,22 @@ int MOV_RM_TF_R_parse(uint8_t byte1, uint8_t byte2, binary_data *binary, int byt
fread(byte, sizeof(byte), 1, bin.binary); fread(byte, sizeof(byte), 1, bin.binary);
extra_bytes_read++; extra_bytes_read++;
low_disp = (uint8_t)byte[0]; low_disp = (uint8_t)byte[0];
reg_value = ((byte2 & regm_mask) >> 3) + ((byte1 & wide_mask) * 8); reg_value = ((byte2 & regm_mask) >> 3) + ((byte1 & wide_mask) * 8);
ea_table_value = (byte2 & (regm_mask >> 3)); ea_table_value = (byte2 & (regm_mask >> 3));
effective_disp = calc_effective_disp(0, low_disp);
//EA STRING GENERATION //EA STRING GENERATION
*ea_string_write_ptr = '['; fill_ea_string(&mem_data, EA_ENCODING_TXT[ea_table_value], effective_disp);
ea_string_write_ptr++;
memcpy(ea_string_write_ptr, EA_ENCODING_TXT[ea_table_value], strlen(EA_ENCODING_TXT[ea_table_value]));
ea_string_write_ptr += strlen(EA_ENCODING_TXT[ea_table_value]);
memcpy(ea_string_write_ptr, " + ", 3);
ea_string_write_ptr += 3;
disp_len = sprintf(ea_string_write_ptr, "%d", low_disp);
ea_string_write_ptr += disp_len;
*ea_string_write_ptr = ']';
//END //END
printf("%s %s, %s\n", "mov", (reg_is_dest ? REG_ENCODING_TXT[reg_value] printf("%s %s, %s\n", "mov", (reg_is_dest ? REG_ENCODING_TXT[reg_value]
: ea_string) : mem_data.string)
, (reg_is_dest ? ea_string , (reg_is_dest ? mem_data.string
: REG_ENCODING_TXT[reg_value])); : REG_ENCODING_TXT[reg_value]));
fprintf(output, "%s %s, %s\n", "mov", (reg_is_dest ? REG_ENCODING_TXT[reg_value] fprintf(output, "%s %s, %s\n", "mov", (reg_is_dest ? REG_ENCODING_TXT[reg_value]
: ea_string) : mem_data.string)
, (reg_is_dest ? ea_string , (reg_is_dest ? mem_data.string
: REG_ENCODING_TXT[reg_value])); : REG_ENCODING_TXT[reg_value]));
break; break;
case (MEM_16BIT_DISP): case (MEM_16BIT_DISP):
@ -375,30 +396,22 @@ int MOV_RM_TF_R_parse(uint8_t byte1, uint8_t byte2, binary_data *binary, int byt
high_disp = (uint8_t)byte[0]; high_disp = (uint8_t)byte[0];
//Composing wide displacement //Composing wide displacement
wide_disp = high_disp << 8; effective_disp = calc_effective_disp(high_disp, low_disp);
wide_disp = wide_disp | low_disp;
reg_value = ((byte2 & regm_mask) >> 3) + ((byte1 & wide_mask) * 8); reg_value = ((byte2 & regm_mask) >> 3) + ((byte1 & wide_mask) * 8);
ea_table_value = (byte2 & (regm_mask >> 3)); ea_table_value = (byte2 & (regm_mask >> 3));
//EA STRING GENERATION //EA STRING GENERATION
*ea_string_write_ptr = '['; fill_ea_string(&mem_data, EA_ENCODING_TXT[ea_table_value], effective_disp);
ea_string_write_ptr++;
memcpy(ea_string_write_ptr, EA_ENCODING_TXT[ea_table_value], strlen(EA_ENCODING_TXT[ea_table_value]));
ea_string_write_ptr += strlen(EA_ENCODING_TXT[ea_table_value]);
memcpy(ea_string_write_ptr, " + ", 3);
ea_string_write_ptr += 3;
disp_len = sprintf(ea_string_write_ptr, "%d", wide_disp);
ea_string_write_ptr += disp_len;
*ea_string_write_ptr = ']';
//END //END
printf("%s %s, %s\n", "mov", (reg_is_dest ? REG_ENCODING_TXT[reg_value] printf("%s %s, %s\n", "mov", (reg_is_dest ? REG_ENCODING_TXT[reg_value]
: ea_string) : mem_data.string)
, (reg_is_dest ? ea_string , (reg_is_dest ? mem_data.string
: REG_ENCODING_TXT[reg_value])); : REG_ENCODING_TXT[reg_value]));
fprintf(output, "%s %s, %s\n", "mov", (reg_is_dest ? REG_ENCODING_TXT[reg_value] fprintf(output, "%s %s, %s\n", "mov", (reg_is_dest ? REG_ENCODING_TXT[reg_value]
: ea_string) : mem_data.string)
, (reg_is_dest ? ea_string , (reg_is_dest ? mem_data.string
: REG_ENCODING_TXT[reg_value])); : REG_ENCODING_TXT[reg_value]));
break; break;
case (MEM_NO_DISP): case (MEM_NO_DISP):

View file

@ -25,7 +25,8 @@ mov ah, [bx + si + 4]
; Source address calculation plus 16-bit displacement ; Source address calculation plus 16-bit displacement
mov al, [bx + si + 4999] mov al, [bx + si + 4999]
; Dest address calculation ; Dest address calculation
mov [bx + di], cx mov [bx + di], cx
mov [bp + si], cl mov [bp + si], cl
mov [bp], ch mov [bp], ch

Binary file not shown.

View file

@ -1,6 +1,9 @@
bits 16 bits 16
; Signed displacements ; Signed displacements
mov ax, [bx - 100]
mov ax, [bx - 3]
mov ax, [bx + di - 40000]
mov ax, [bx + di - 37] mov ax, [bx + di - 37]
mov [si - 300], cx mov [si - 300], cx
mov dx, [bx - 32] mov dx, [bx - 32]

Binary file not shown.

View file

@ -1,18 +1,16 @@
bits 16 bits 16
mov si, bx mov ax, [bx -100]
mov dh, al mov ax, [bx -3]
mov cl, 12 mov ax, [bx + di + 25536]
mov ch, 244 mov ax, [bx + di -37]
mov cx, 12 mov [si -300], cx
mov cx, 65524 mov dx, [bx -32]
mov dx, 3948 mov [bp + di], byte 7
mov dx, 61588 mov [di + 901], word 347
mov al, [bx + si] mov bp, [5]
mov bx, [bp + di] mov bx, [3458]
mov dx, [bp + 0] mov ax, [2555]
mov ah, [bx + si + 4] mov ax, [16]
mov al, [bx + si + 4999] mov [2554], ax
mov [bx + di], cx mov [15], ax
mov [bp + si], cl
mov [bp + 0], ch