From 86351aafe218a7386f6578be3c4da3edcdcb0c98 Mon Sep 17 00:00:00 2001 From: Kartik Agaram Date: Fri, 12 Jun 2020 07:57:27 -0700 Subject: 6513 --- html/050_write.subx.html | 94 +++++++++++++++++++++++------------------------- 1 file changed, 45 insertions(+), 49 deletions(-) (limited to 'html/050_write.subx.html') diff --git a/html/050_write.subx.html b/html/050_write.subx.html index 7d0d3ac4..455e3886 100644 --- a/html/050_write.subx.html +++ b/html/050_write.subx.html @@ -65,55 +65,51 @@ if ('onhashchange' in window) { 6 # . 1-3 bytes 3 bits 2 bits 3 bits 3 bits 3 bits 2 bits 2 bits 0/1/2/4 bytes 0/1/2/4 bytes 7 8 Entry: # just exit; can't test _write just yet - 9 # . syscall(exit, 0) -10 bb/copy-to-ebx 0/imm32 -11 b8/copy-to-eax 1/imm32/exit -12 cd/syscall 0x80/imm8 -13 -14 _write: # fd: int, s: (addr array byte) -15 # . prologue -16 55/push-ebp -17 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp -18 # . save registers -19 50/push-eax -20 51/push-ecx -21 52/push-edx -22 53/push-ebx -23 # syscall(write, fd, (data) s+4, (size) *s) -24 # . ebx = fd -25 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 3/r32/ebx 8/disp8 . # copy *(ebp+8) to ebx -26 # . var data/ecx: (addr byte) = s+4 -27 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 1/r32/ecx 0xc/disp8 . # copy *(ebp+12) to ecx -28 81 0/subop/add 3/mod/direct 1/rm32/ecx . . . . . 4/imm32 # add to ecx -29 # . var size/edx: int = *s -30 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 2/r32/edx 0xc/disp8 . # copy *(ebp+12) to edx -31 8b/copy 0/mod/indirect 2/rm32/edx . . . 2/r32/edx . . # copy *edx to edx -32 # . syscall -33 b8/copy-to-eax 4/imm32/write -34 cd/syscall 0x80/imm8 -35 # if (eax < 0) abort -36 3d/compare-eax-with 0/imm32 -37 0f 8c/jump-if-< $_write:abort/disp32 -38 $_write:end: -39 # . restore registers -40 5b/pop-to-ebx -41 5a/pop-to-edx -42 59/pop-to-ecx -43 58/pop-to-eax -44 # . epilogue -45 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp -46 5d/pop-to-ebp -47 c3/return -48 -49 $_write:abort: -50 # can't write a message here for risk of an infinite loop, so we'll use a special exit code instead -51 # . syscall(exit, 255) -52 bb/copy-to-ebx 0xff/imm32 -53 b8/copy-to-eax 1/imm32/exit -54 cd/syscall 0x80/imm8 -55 # never gets here -56 -57 # . . vim:nowrap:textwidth=0 + 9 bb/copy-to-ebx 0/imm32 +10 e8/call syscall_exit/disp32 +11 +12 _write: # fd: int, s: (addr array byte) +13 # . prologue +14 55/push-ebp +15 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp +16 # . save registers +17 50/push-eax +18 51/push-ecx +19 52/push-edx +20 53/push-ebx +21 # syscall(write, fd, (data) s+4, (size) *s) +22 # . ebx = fd +23 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 3/r32/ebx 8/disp8 . # copy *(ebp+8) to ebx +24 # . var data/ecx: (addr byte) = s+4 +25 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 1/r32/ecx 0xc/disp8 . # copy *(ebp+12) to ecx +26 81 0/subop/add 3/mod/direct 1/rm32/ecx . . . . . 4/imm32 # add to ecx +27 # . var size/edx: int = *s +28 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 2/r32/edx 0xc/disp8 . # copy *(ebp+12) to edx +29 8b/copy 0/mod/indirect 2/rm32/edx . . . 2/r32/edx . . # copy *edx to edx +30 # . syscall +31 e8/call syscall_write/disp32 +32 # if (eax < 0) abort +33 3d/compare-eax-with 0/imm32 +34 0f 8c/jump-if-< $_write:abort/disp32 +35 $_write:end: +36 # . restore registers +37 5b/pop-to-ebx +38 5a/pop-to-edx +39 59/pop-to-ecx +40 58/pop-to-eax +41 # . epilogue +42 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp +43 5d/pop-to-ebp +44 c3/return +45 +46 $_write:abort: +47 # can't write a message here for risk of an infinite loop, so we'll use a special exit code instead +48 # . syscall(exit, 255) +49 bb/copy-to-ebx 0xff/imm32 +50 e8/call syscall_exit/disp32 +51 # never gets here +52 +53 # . . vim:nowrap:textwidth=0 -- cgit 1.4.1-2-gfad0