cba54b205b
- refactor code for transfer buffer reads/writes, real mode int 0x21 calls, and assembler segment declarations - define transfer buffer size in one place - beef up error checking for transfer buffer operations (prevent buffer overflows) - also optimize such operations to transfer dword by dword where feasible
59 lines
1.2 KiB
ArmAsm
59 lines
1.2 KiB
ArmAsm
#
|
|
! $Source$
|
|
! $State$
|
|
! $Revision$
|
|
|
|
#include "libsysasm.h"
|
|
|
|
! .sys_scpyout: copy the ASCIIZ string starting from ds:eax to the
|
|
! transfer buffer. The resulting ASCIIZ string, including the final null,
|
|
! should fit into the entire transfer buffer. Return eax := offset of
|
|
! transfer buffer in real mode data segment. Return CF = 1 if and only if
|
|
! the ASCIIZ string is too long to fit. Preserve all other registers,
|
|
! except the flags.
|
|
!
|
|
! .sys_sncpyout: copy the ASCIIZ string starting from ds:eax to offset
|
|
! edx into the transfer buffer. The resulting ASCIIZ string should occupy
|
|
! at most ecx bytes, including the final null. Return eax : offset of
|
|
! string in real mode data segment. Return CF = 1 if and only if the ASCIIZ
|
|
! string is too long to fit. Preserve all other registers, except the
|
|
! flags.
|
|
|
|
.extern .sys_scpyout
|
|
.extern .sys_sncpyout
|
|
.sys_scpyout:
|
|
push ecx
|
|
push edx
|
|
mov ecx, TRANSFER_BUFFER_SIZE
|
|
xor edx, edx
|
|
jmp .cont
|
|
.sys_sncpyout:
|
|
push ecx
|
|
push edx
|
|
.cont:
|
|
push esi
|
|
push edi
|
|
mov esi, eax
|
|
movzx edi, (transfer_buffer_ptr)
|
|
add edi, edx
|
|
mov edx, edi
|
|
mov es, (pmode_ds)
|
|
jcxz .error
|
|
.loop:
|
|
lodsb
|
|
stosb
|
|
testb al, al
|
|
loopnz .loop
|
|
jz .ok
|
|
.error:
|
|
stc
|
|
.ok:
|
|
xchg edx, eax
|
|
mov edx, ss
|
|
mov es, edx
|
|
pop edi
|
|
pop esi
|
|
pop edx
|
|
pop ecx
|
|
ret
|