|
|
push bp |
|
|
mov bp,sp |
|
|
push 10[bp] |
|
|
push 8[bp] |
|
|
push 6[bp] |
|
|
call _main |
|
|
add sp, #0x6 |
|
|
pop bp |
|
|
retf |
|
|
! 1 |
|
|
! 1 # 1 "main.c" |
|
|
! 1 # 1 "std_singos/stdio.h" |
|
|
! 1 void print(string); |
|
|
!BCC_EOS |
|
|
! 2 void* dump_ax_return(input); |
|
|
!BCC_EOS |
|
|
! 3 |
|
|
! 4 void print(string) |
|
|
! 5 char* string; |
|
|
export _print |
|
|
_print: |
|
|
!BCC_EOS |
|
|
! 6 { |
|
|
! 7 #asm |
|
|
!BCC_ASM |
|
|
_print.string set 2 |
|
|
|
|
|
push bp |
|
|
mov bp,sp |
|
|
mov si,4[bp] |
|
|
call 0x0000:0x7C47 |
|
|
pop bp |
|
|
! 13 endasm |
|
|
!BCC_ENDASM |
|
|
! 14 } |
|
|
ret |
|
|
! 15 |
|
|
! 16 void print_stack(argument) |
|
|
! 17 { |
|
|
export _print_stack |
|
|
_print_stack: |
|
|
! 18 #asm |
|
|
!BCC_ASM |
|
|
_print_stack.argument set 2 |
|
|
|
|
|
push bp |
|
|
mov bp,sp |
|
|
push ds |
|
|
push ax |
|
|
|
|
|
mov ax, ss |
|
|
mov ds, ax |
|
|
mov si,4[bp] |
|
|
call 0x0000:0x7C47 |
|
|
|
|
|
pop ax |
|
|
pop ds |
|
|
pop bp |
|
|
! 32 endasm |
|
|
!BCC_ENDASM |
|
|
! 33 } |
|
|
ret |
|
|
! 34 |
|
|
! 35 void* dump_ax_return(input) |
|
|
! 36 void* input; |
|
|
export _dump_ax_return |
|
|
_dump_ax_return: |
|
|
!BCC_EOS |
|
|
! 37 { |
|
|
! 38 return input; |
|
|
push bp |
|
|
mov bp,sp |
|
|
push di |
|
|
push si |
|
|
mov ax,4[bp] |
|
|
pop si |
|
|
pop di |
|
|
pop bp |
|
|
ret |
|
|
!BCC_EOS |
|
|
! 39 } |
|
|
! 40 |
|
|
! 41 void dump_ax(input) |
|
|
! 42 void* input; |
|
|
export _dump_ax |
|
|
_dump_ax: |
|
|
!BCC_EOS |
|
|
! 43 { |
|
|
! 44 dump_ax_return(input) |
|
|
push bp |
|
|
mov bp,sp |
|
|
push di |
|
|
push si |
|
|
! 45 #asm |
|
|
! Debug: list * void input = [S+6+2] (used reg = ) |
|
|
push 4[bp] |
|
|
! Debug: func () * void = dump_ax_return+0 (used reg = ) |
|
|
call _dump_ax_return |
|
|
inc sp |
|
|
inc sp |
|
|
!BCC_EOS |
|
|
!BCC_ASM |
|
|
_dump_ax.input set 8 |
|
|
.dump_ax.input set 4 |
|
|
push bp |
|
|
mov bp,sp |
|
|
call 0x000:0x7C2A |
|
|
pop bp |
|
|
! 50 endasm |
|
|
!BCC_ENDASM |
|
|
!BCC_EOS |
|
|
! 51 } |
|
|
pop si |
|
|
pop di |
|
|
pop bp |
|
|
ret |
|
|
! 52 |
|
|
! 53 void print_newline() |
|
|
! 54 { |
|
|
export _print_newline |
|
|
_print_newline: |
|
|
! 55 #asm |
|
|
!BCC_ASM |
|
|
|
|
|
printCRLF: |
|
|
mov ah, #0xE |
|
|
mov al, #13 |
|
|
int #0x10 |
|
|
mov al, #10 |
|
|
int #0x10 |
|
|
ret |
|
|
! 63 endasm |
|
|
!BCC_ENDASM |
|
|
! 64 } |
|
|
ret |
|
|
! 65 # 1 "std_singos/stdlib.h" |
|
|
! 1 unsigned int global_heap_start = 0; |
|
|
export _global_heap_start |
|
|
_global_heap_start: |
|
|
.word 0 |
|
|
!BCC_EOS |
|
|
! 2 unsigned int global_heap_end = 0; |
|
|
export _global_heap_end |
|
|
_global_heap_end: |
|
|
.word 0 |
|
|
!BCC_EOS |
|
|
! 3 unsigned int global_heap_next = 0; |
|
|
export _global_heap_next |
|
|
_global_heap_next: |
|
|
.word 0 |
|
|
!BCC_EOS |
|
|
! 4 |
|
|
! 5 void* malloc(num_bytes); |
|
|
!BCC_EOS |
|
|
! 6 void* calloc(number_elements, size); |
|
|
!BCC_EOS |
|
|
! 7 int set_heap_settings(param_start, param_end); |
|
|
!BCC_EOS |
|
|
! 8 unsigned int get_heap_next(); |
|
|
!BCC_EOS |
|
|
! 9 |
|
|
! 10 void* malloc(num_bytes) |
|
|
! 11 int num_bytes; |
|
|
.text |
|
|
export _malloc |
|
|
_malloc: |
|
|
!BCC_EOS |
|
|
! 12 { |
|
|
! 13 unsigned int allocated_pointer = global_heap_next; |
|
|
push bp |
|
|
mov bp,sp |
|
|
push di |
|
|
push si |
|
|
dec sp |
|
|
dec sp |
|
|
! Debug: eq unsigned int = [global_heap_next+0] to unsigned int allocated_pointer = [S+8-8] (used reg = ) |
|
|
mov ax,[_global_heap_next] |
|
|
mov -6[bp],ax |
|
|
!BCC_EOS |
|
|
! 14 global_heap_next = global_heap_next + num_bytes; |
|
|
! Debug: add int num_bytes = [S+8+2] to unsigned int = [global_heap_next+0] (used reg = ) |
|
|
mov ax,[_global_heap_next] |
|
|
add ax,4[bp] |
|
|
! Debug: eq unsigned int = ax+0 to unsigned int = [global_heap_next+0] (used reg = ) |
|
|
mov [_global_heap_next],ax |
|
|
!BCC_EOS |
|
|
! 15 if (global_heap_next > global_heap_end) |
|
|
! Debug: gt unsigned int = [global_heap_end+0] to unsigned int = [global_heap_next+0] (used reg = ) |
|
|
mov ax,[_global_heap_next] |
|
|
cmp ax,[_global_heap_end] |
|
|
jbe .1 |
|
|
.2: |
|
|
! 16 { |
|
|
! 17 return 0; |
|
|
xor ax,ax |
|
|
inc sp |
|
|
inc sp |
|
|
pop si |
|
|
pop di |
|
|
pop bp |
|
|
ret |
|
|
!BCC_EOS |
|
|
! 18 } |
|
|
! 19 |
|
|
! 20 return allocated_pointer; |
|
|
.1: |
|
|
mov ax,-6[bp] |
|
|
inc sp |
|
|
inc sp |
|
|
pop si |
|
|
pop di |
|
|
pop bp |
|
|
ret |
|
|
!BCC_EOS |
|
|
! 21 } |
|
|
! 22 |
|
|
! 23 void* calloc(number_elements, size) |
|
|
! 24 unsigned int number_elements; |
|
|
export _calloc |
|
|
_calloc: |
|
|
!BCC_EOS |
|
|
! 25 unsigned int size; |
|
|
!BCC_EOS |
|
|
! 26 { |
|
|
! 27 int i; |
|
|
!BCC_EOS |
|
|
! 28 char* temp_pointer; |
|
|
!BCC_EOS |
|
|
! 29 unsigned int num_bytes = number_elements * size; |
|
|
push bp |
|
|
mov bp,sp |
|
|
push di |
|
|
push si |
|
|
add sp,*-6 |
|
|
! Debug: mul unsigned int size = [S+$C+4] to unsigned int number_elements = [S+$C+2] (used reg = ) |
|
|
mov ax,4[bp] |
|
|
mov cx,6[bp] |
|
|
imul cx |
|
|
! Debug: eq unsigned int = ax+0 to unsigned int num_bytes = [S+$C-$C] (used reg = ) |
|
|
mov -$A[bp],ax |
|
|
!BCC_EOS |
|
|
! 30 void* allocated_pointer = global_heap_next; |
|
|
dec sp |
|
|
dec sp |
|
|
! Debug: eq unsigned int = [global_heap_next+0] to * void allocated_pointer = [S+$E-$E] (used reg = ) |
|
|
mov bx,[_global_heap_next] |
|
|
mov -$C[bp],bx |
|
|
!BCC_EOS |
|
|
! 31 global_heap_next = global_heap_next + num_bytes; |
|
|
! Debug: add unsigned int num_bytes = [S+$E-$C] to unsigned int = [global_heap_next+0] (used reg = ) |
|
|
mov ax,[_global_heap_next] |
|
|
add ax,-$A[bp] |
|
|
! Debug: eq unsigned int = ax+0 to unsigned int = [global_heap_next+0] (used reg = ) |
|
|
mov [_global_heap_next],ax |
|
|
!BCC_EOS |
|
|
! 32 if (global_heap_next > global_heap_end) |
|
|
! Debug: gt unsigned int = [global_heap_end+0] to unsigned int = [global_heap_next+0] (used reg = ) |
|
|
mov ax,[_global_heap_next] |
|
|
cmp ax,[_global_heap_end] |
|
|
jbe .3 |
|
|
.4: |
|
|
! 33 { |
|
|
! 34 return 0; |
|
|
xor ax,ax |
|
|
add sp,*8 |
|
|
pop si |
|
|
pop di |
|
|
pop bp |
|
|
ret |
|
|
!BCC_EOS |
|
|
! 35 } |
|
|
! 36 |
|
|
! 37 |
|
|
! 38 temp_pointer = allocated_pointer; |
|
|
.3: |
|
|
! Debug: eq * void allocated_pointer = [S+$E-$E] to * char temp_pointer = [S+$E-$A] (used reg = ) |
|
|
mov bx,-$C[bp] |
|
|
mov -8[bp],bx |
|
|
!BCC_EOS |
|
|
! 39 for (i = 0; i < num_bytes; ++i) |
|
|
! Debug: eq int = const 0 to int i = [S+$E-8] (used reg = ) |
|
|
xor ax,ax |
|
|
mov -6[bp],ax |
|
|
!BCC_EOS |
|
|
!BCC_EOS |
|
|
! 40 { |
|
|
jmp .7 |
|
|
.8: |
|
|
! 41 *temp_pointer = 0; |
|
|
mov bx,-8[bp] |
|
|
! Debug: eq int = const 0 to char = [bx+0] (used reg = ) |
|
|
xor al,al |
|
|
mov [bx],al |
|
|
!BCC_EOS |
|
|
! 42 temp_pointer++; |
|
|
! Debug: postinc * char temp_pointer = [S+$E-$A] (used reg = ) |
|
|
mov bx,-8[bp] |
|
|
inc bx |
|
|
mov -8[bp],bx |
|
|
!BCC_EOS |
|
|
! 43 } |
|
|
! 44 |
|
|
! 45 return allocated_pointer; |
|
|
.6: |
|
|
! Debug: preinc int i = [S+$E-8] (used reg = ) |
|
|
mov ax,-6[bp] |
|
|
inc ax |
|
|
mov -6[bp],ax |
|
|
.7: |
|
|
! Debug: lt unsigned int num_bytes = [S+$E-$C] to int i = [S+$E-8] (used reg = ) |
|
|
mov ax,-6[bp] |
|
|
cmp ax,-$A[bp] |
|
|
jb .8 |
|
|
.9: |
|
|
.5: |
|
|
mov ax,-$C[bp] |
|
|
add sp,*8 |
|
|
pop si |
|
|
pop di |
|
|
pop bp |
|
|
ret |
|
|
!BCC_EOS |
|
|
! 46 } |
|
|
! 47 |
|
|
! 48 int set_heap_settings(param_start, param_end) |
|
|
! Register BX used in function calloc |
|
|
! 49 unsigned int param_start; |
|
|
export _set_heap_settings |
|
|
_set_heap_settings: |
|
|
!BCC_EOS |
|
|
! 50 unsigned int param_end; |
|
|
!BCC_EOS |
|
|
! 51 { |
|
|
! 52 global_heap_start = param_start; |
|
|
push bp |
|
|
mov bp,sp |
|
|
push di |
|
|
push si |
|
|
! Debug: eq unsigned int param_start = [S+6+2] to unsigned int = [global_heap_start+0] (used reg = ) |
|
|
mov ax,4[bp] |
|
|
mov [_global_heap_start],ax |
|
|
!BCC_EOS |
|
|
! 53 global_heap_next = param_start; |
|
|
! Debug: eq unsigned int param_start = [S+6+2] to unsigned int = [global_heap_next+0] (used reg = ) |
|
|
mov ax,4[bp] |
|
|
mov [_global_heap_next],ax |
|
|
!BCC_EOS |
|
|
! 54 global_heap_end = param_end; |
|
|
! Debug: eq unsigned int param_end = [S+6+4] to unsigned int = [global_heap_end+0] (used reg = ) |
|
|
mov ax,6[bp] |
|
|
mov [_global_heap_end],ax |
|
|
!BCC_EOS |
|
|
! 55 return 0; |
|
|
xor ax,ax |
|
|
pop si |
|
|
pop di |
|
|
pop bp |
|
|
ret |
|
|
!BCC_EOS |
|
|
! 56 } |
|
|
! 57 |
|
|
! 58 unsigned int get_heap_next() |
|
|
! 59 { |
|
|
export _get_heap_next |
|
|
_get_heap_next: |
|
|
! 60 return global_heap_next; |
|
|
push bp |
|
|
mov bp,sp |
|
|
push di |
|
|
push si |
|
|
mov ax,[_global_heap_next] |
|
|
pop si |
|
|
pop di |
|
|
pop bp |
|
|
ret |
|
|
!BCC_EOS |
|
|
! 61 # 16 "main.h" |
|
|
! 16 } |
|
|
! 17 # 2 "std_singos/string.h" |
|
|
! 2 type |
|
|
! 2 def struct Length_String { |
|
|
! 3 short dynamic; |
|
|
!BCC_EOS |
|
|
! 4 unsigned int length; |
|
|
!BCC_EOS |
|
|
! 5 char *chars; |
|
|
!BCC_EOS |
|
|
! 6 } Length_String; |
|
|
!BCC_EOS |
|
|
! 7 |
|
|
! 8 typedef struct String_Array { |
|
|
! 9 unsigned int length; |
|
|
!BCC_EOS |
|
|
! 10 Length_String **strings; |
|
|
!BCC_EOS |
|
|
! 11 } String_Array; |
|
|
!BCC_EOS |
|
|
! 12 |
|
|
! 13 void strcpy (destination, destination_segment, source, source_segment ); |
|
|
!BCC_EOS |
|
|
! 14 int strlen (source, source_segment); |
|
|
!BCC_EOS |
|
|
! 15 void memcpy (destination, destination_segment, source, source_segment, num_bytes ); |
|
|
!BCC_EOS |
|
|
! 16 |
|
|
! 17 |
|
|
! 18 String_Array *string_split_c(string, delim, keep_delim); |
|
|
!BCC_EOS |
|
|
! 19 Length_String *make_length_string(length, chars); |
|
|
!BCC_EOS |
|
|
! 20 Length_String *make_length_string_c(cstring); |
|
|
!BCC_EOS |
|
|
! 21 String_Array *length_string_split(string, delim, keep_delim); |
|
|
!BCC_EOS |
|
|
! 22 String_Array *create_length_string_array(array_size); |
|
|
!BCC_EOS |
|
|
! 23 Length_String *create_length_string(length, chars); |
|
|
!BCC_EOS |
|
|
! 24 |
|
|
! 25 |
|
|
! 26 |
|
|
! 27 int strlen (source, source_segment) |
|
|
! 28 { |
|
|
export _strlen |
|
|
_strlen: |
|
|
! 29 #asm |
|
|
!BCC_ASM |
|
|
_strlen.source set 2 |
|
|
_strlen.source_segment set 4 |
|
|
|
|
|
|
|
|
push bp |
|
|
mov bp,sp |
|
|
push ds |
|
|
push bx |
|
|
|
|
|
mov ax, 6[bp]; |
|
|
mov ds, ax |
|
|
|
|
|
mov bx, 4[bp]; |
|
|
|
|
|
label_strlen: |
|
|
mov cx, #0x0 ; Set counte to zero |
|
|
.label_strlen_loop: |
|
|
mov BYTE al, [bx] |
|
|
cmp al, #0x0 |
|
|
je .label_strlen_done |
|
|
inc cx ; Count 1 |
|
|
inc bx ; Look at next char |
|
|
jmp .label_strlen_loop |
|
|
.label_strlen_done: |
|
|
mov ax, cx |
|
|
|
|
|
pop bx |
|
|
pop ds |
|
|
pop bp |
|
|
! 57 endasm |
|
|
!BCC_ENDASM |
|
|
! 58 } |
|
|
ret |
|
|
! 59 |
|
|
! 60 void strcpy (destination, destination_segment, source, source_segment ) |
|
|
! 61 char *destination; |
|
|
export _strcpy |
|
|
_strcpy: |
|
|
!BCC_EOS |
|
|
! 62 int destination_segment; |
|
|
!BCC_EOS |
|
|
! 63 char *source; |
|
|
!BCC_EOS |
|
|
! 64 int source_segment; |
|
|
!BCC_EOS |
|
|
! 65 { |
|
|
! 66 #asm |
|
|
!BCC_ASM |
|
|
_strcpy.source set 6 |
|
|
_strcpy.destination set 2 |
|
|
_strcpy.source_segment set 8 |
|
|
_strcpy.destination_segment set 4 |
|
|
; copy two strings |
|
|
; IN si: the first (zero terminated) string |
|
|
; IN di: the second (zero terminated) string |
|
|
; OUT SF and ZF (same semantics as cmp) |
|
|
|
|
|
! 72 76 |
|
|
|
|
|
push bp |
|
|
mov bp,sp |
|
|
label_strcpy: |
|
|
push ax |
|
|
push bx |
|
|
push di |
|
|
push es |
|
|
push si |
|
|
push ds |
|
|
mov ax, 4[bp]; ; |
|
|
mov di, ax |
|
|
mov ax, 6[bp]; ; |
|
|
mov es, ax |
|
|
mov ax, 8[bp]; ; |
|
|
mov si, ax |
|
|
mov ax, 10[bp]; ; |
|
|
mov ds, ax |
|
|
mov cx, 0x050 ;TODO(Jrn) Hardcded number of bytes to copy |
|
|
.label_strcpy_loop: |
|
|
movsb |
|
|
cmp cx, 0x0 |
|
|
je .label_strcpy_end |
|
|
dec cx |
|
|
jmp .label_strcpy_loop |
|
|
.label_strcpy_end: |
|
|
pop ds |
|
|
pop si |
|
|
pop es |
|
|
pop di |
|
|
pop bx |
|
|
pop ax |
|
|
pop bp |
|
|
|
|
|
! 110 endasm |
|
|
!BCC_ENDASM |
|
|
! 111 } |
|
|
ret |
|
|
! 112 |
|
|
! 113 void memcpy (destination, destination_segment, source, source_segment, num_bytes) |
|
|
! 114 void *destination; |
|
|
export _memcpy |
|
|
_memcpy: |
|
|
!BCC_EOS |
|
|
! 115 int destination_segment; |
|
|
!BCC_EOS |
|
|
! 116 void *source; |
|
|
!BCC_EOS |
|
|
! 117 int source_segment; |
|
|
!BCC_EOS |
|
|
! 118 int num_bytes; |
|
|
!BCC_EOS |
|
|
! 119 { |
|
|
! 120 #asm |
|
|
!BCC_ASM |
|
|
_memcpy.source set 6 |
|
|
_memcpy.destination set 2 |
|
|
_memcpy.num_bytes set $A |
|
|
_memcpy.source_segment set 8 |
|
|
_memcpy.destination_segment set 4 |
|
|
; copy two strings |
|
|
; IN si: the first (zero terminated) string |
|
|
; IN di: the second (zero terminated) string |
|
|
; OUT SF and ZF (same semantics as cmp) |
|
|
|
|
|
! 126 131 |
|
|
|
|
|
push bp |
|
|
mov bp,sp |
|
|
label_memcpy: |
|
|
push ax |
|
|
push bx |
|
|
push di |
|
|
push es |
|
|
push si |
|
|
push ds |
|
|
mov ax, 4[bp]; ; |
|
|
mov di, ax |
|
|
mov ax, 6[bp]; ; |
|
|
mov es, ax |
|
|
mov ax, 8[bp]; ; |
|
|
mov si, ax |
|
|
mov ax, 10[bp]; ; |
|
|
mov ds, ax |
|
|
mov cx, 12[bp]; |
|
|
.label_memcpy_loop: |
|
|
movsb |
|
|
cmp cx, 0x0 |
|
|
je .label_memcpy_end |
|
|
dec cx |
|
|
jmp .label_memcpy_loop |
|
|
.label_memcpy_end: |
|
|
pop ds |
|
|
pop si |
|
|
pop es |
|
|
pop di |
|
|
pop bx |
|
|
pop ax |
|
|
pop bp |
|
|
|
|
|
! 165 endasm |
|
|
!BCC_ENDASM |
|
|
! 166 } |
|
|
ret |
|
|
! 167 |
|
|
! 168 String_Array *string_split_c(string, delim, keep_delim) |
|
|
! 169 char *string; |
|
|
export _string_split_c |
|
|
_string_split_c: |
|
|
!BCC_EOS |
|
|
! 170 char delim; |
|
|
!BCC_EOS |
|
|
! 171 short keep_delim; |
|
|
!BCC_EOS |
|
|
! 172 { |
|
|
! 173 return length_string_split(make_length_string_c(string), delim, keep_delim); |
|
|
push bp |
|
|
mov bp,sp |
|
|
push di |
|
|
push si |
|
|
! Debug: list short keep_delim = [S+6+6] (used reg = ) |
|
|
push 8[bp] |
|
|
! Debug: list char delim = [S+8+4] (used reg = ) |
|
|
mov al,6[bp] |
|
|
xor ah,ah |
|
|
push ax |
|
|
! Debug: list * char string = [S+$A+2] (used reg = ) |
|
|
push 4[bp] |
|
|
! Debug: func () * struct Length_String = make_length_string_c+0 (used reg = ) |
|
|
call _make_length_string_c |
|
|
inc sp |
|
|
inc sp |
|
|
! Debug: list * struct Length_String = ax+0 (used reg = ) |
|
|
push ax |
|
|
! Debug: func () * struct String_Array = length_string_split+0 (used reg = ) |
|
|
call _length_string_split |
|
|
add sp,*6 |
|
|
! Debug: cast * struct String_Array = const 0 to * struct String_Array = ax+0 (used reg = ) |
|
|
pop si |
|
|
pop di |
|
|
pop bp |
|
|
ret |
|
|
!BCC_EOS |
|
|
! 174 } |
|
|
! 175 |
|
|
! 176 Length_String *make_length_string_c(cstring) |
|
|
! 177 char *cstring; |
|
|
export _make_length_string_c |
|
|
_make_length_string_c: |
|
|
!BCC_EOS |
|
|
! 178 { |
|
|
! 179 return make_length_string(strlen(cstring, 0x7e0), cstring); |
|
|
push bp |
|
|
mov bp,sp |
|
|
push di |
|
|
push si |
|
|
! Debug: list * char cstring = [S+6+2] (used reg = ) |
|
|
push 4[bp] |
|
|
! Debug: list int = const $7E0 (used reg = ) |
|
|
mov ax,#$7E0 |
|
|
push ax |
|
|
! Debug: list * char cstring = [S+$A+2] (used reg = ) |
|
|
push 4[bp] |
|
|
! Debug: func () int = strlen+0 (used reg = ) |
|
|
call _strlen |
|
|
add sp,*4 |
|
|
! Debug: list int = ax+0 (used reg = ) |
|
|
push ax |
|
|
! Debug: func () * struct Length_String = make_length_string+0 (used reg = ) |
|
|
call _make_length_string |
|
|
add sp,*4 |
|
|
! Debug: cast * struct Length_String = const 0 to * struct Length_String = ax+0 (used reg = ) |
|
|
pop si |
|
|
pop di |
|
|
pop bp |
|
|
ret |
|
|
!BCC_EOS |
|
|
! 180 } |
|
|
! 181 |
|
|
! 182 Length_String *make_length_string(length, chars) |
|
|
! 183 unsigned int length; |
|
|
export _make_length_string |
|
|
_make_length_string: |
|
|
!BCC_EOS |
|
|
! 184 char *chars; |
|
|
!BCC_EOS |
|
|
! 185 { |
|
|
! 186 |
|
|
! 187 Length_String *legth_string = malloc(sizeof(Length_String)); |
|
|
push bp |
|
|
mov bp,sp |
|
|
push di |
|
|
push si |
|
|
dec sp |
|
|
dec sp |
|
|
! Debug: list int = const 6 (used reg = ) |
|
|
mov ax,*6 |
|
|
push ax |
|
|
! Debug: func () * void = malloc+0 (used reg = ) |
|
|
call _malloc |
|
|
inc sp |
|
|
inc sp |
|
|
! Debug: eq * void = ax+0 to * struct Length_String legth_string = [S+8-8] (used reg = ) |
|
|
mov -6[bp],ax |
|
|
!BCC_EOS |
|
|
! 188 char *copy = malloc(length + 1); |
|
|
dec sp |
|
|
dec sp |
|
|
! Debug: add int = const 1 to unsigned int length = [S+$A+2] (used reg = ) |
|
|
mov ax,4[bp] |
|
|
! Debug: list unsigned int = ax+1 (used reg = ) |
|
|
inc ax |
|
|
push ax |
|
|
! Debug: func () * void = malloc+0 (used reg = ) |
|
|
call _malloc |
|
|
inc sp |
|
|
inc sp |
|
|
! Debug: eq * void = ax+0 to * char copy = [S+$A-$A] (used reg = ) |
|
|
mov -8[bp],ax |
|
|
!BCC_EOS |
|
|
! 189 memcpy(copy, 0x7e0, chars, 0x7e0, length); |
|
|
! Debug: list unsigned int length = [S+$A+2] (used reg = ) |
|
|
push 4[bp] |
|
|
! Debug: list int = const $7E0 (used reg = ) |
|
|
mov ax,#$7E0 |
|
|
push ax |
|
|
! Debug: list * char chars = [S+$E+4] (used reg = ) |
|
|
push 6[bp] |
|
|
! Debug: list int = const $7E0 (used reg = ) |
|
|
mov ax,#$7E0 |
|
|
push ax |
|
|
! Debug: list * char copy = [S+$12-$A] (used reg = ) |
|
|
push -8[bp] |
|
|
! Debug: func () void = memcpy+0 (used reg = ) |
|
|
call _memcpy |
|
|
add sp,*$A |
|
|
!BCC_EOS |
|
|
! 190 copy[length] = ' |