void strcpy (destination, destination_segment, source, source_segment ); int strlen (source, source_segment); void memcpy (destination, destination_segment, source, source_segment, num_bytes ); int strlen (source, source_segment) { #asm #define strlen_SOURCE 4[bp]; #define strlen_SOURCE_SEGMENT 6[bp]; push bp mov bp,sp push ds push bx mov ax, strlen_SOURCE_SEGMENT mov ds, ax mov bx, strlen_SOURCE 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 #endasm } void strcpy (destination, destination_segment, source, source_segment ) char *destination; int destination_segment; char *source; int source_segment; { #asm ; 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) #define DESTINATION 4[bp]; #define DESTINATION_SEGMENT 6[bp]; #define SOURCE 8[bp]; #define SOURCE_SEGMENT 10[bp]; push bp mov bp,sp label_strcpy: push ax push bx push di push es push si push ds mov ax, DESTINATION; mov di, ax mov ax, DESTINATION_SEGMENT; mov es, ax mov ax, SOURCE; mov si, ax mov ax, SOURCE_SEGMENT; mov ds, ax mov cx, 0x050 // TODO(Jørn) 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 #endasm } void memcpy (destination, destination_segment, source, source_segment, num_bytes) void *destination; int destination_segment; void *source; int source_segment; int num_bytes; { #asm ; 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) #define DESTINATION 4[bp]; #define DESTINATION_SEGMENT 6[bp]; #define SOURCE 8[bp]; #define SOURCE_SEGMENT 10[bp]; #define NUM_BYTES 12[bp]; push bp mov bp,sp label_memcpy: push ax push bx push di push es push si push ds mov ax, DESTINATION; mov di, ax mov ax, DESTINATION_SEGMENT; mov es, ax mov ax, SOURCE; mov si, ax mov ax, SOURCE_SEGMENT; mov ds, ax mov cx, NUM_BYTES .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 #endasm }