From 8aeb85f04ee68b960a6d326aca1a17dec2f6d019 Mon Sep 17 00:00:00 2001 From: Kartik Agaram Date: Mon, 9 Dec 2019 01:26:58 -0800 Subject: 5806 --- html/050_write.subx.html | 106 ++++++++++++++++++++++++++++------------------- 1 file changed, 63 insertions(+), 43 deletions(-) (limited to 'html/050_write.subx.html') diff --git a/html/050_write.subx.html b/html/050_write.subx.html index be9724da..71734034 100644 --- a/html/050_write.subx.html +++ b/html/050_write.subx.html @@ -70,50 +70,70 @@ if ('onhashchange' in window) { 11 b8/copy-to-eax 1/imm32/exit 12 cd/syscall 0x80/imm8 13 -14 _write: # fd : int, s : (address 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 # . fd : ebx -25 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 3/r32/ebx 8/disp8 . # copy *(ebp+8) to ebx -26 # . data : ecx = 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 # . size : edx = *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-lesser $_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 +14 # Since this is the first file of SubX code, a note about type comments. +15 # Eventually we'll build a slightly higher-level safe language atop SubX. +16 # Even though we don't have the safe language yet, we'll start thinking in +17 # terms of the higher-level types in comments. +18 # +19 # Mu will have two kinds of addresses: +20 # - 'ref' which is used to point to a unique element, because machine +21 # code can't store large types in registers. +22 # - 'handle' which can point to a heap allocation, different heap allocations +23 # at different times, or even at times nothing at all. +24 # +25 # The type 'address' can be obtained from either a ref or handle, but it can +26 # only be stored on the stack (say to pass objects by reference). +27 # Conversely, a ref can't be copied into another ref, only to an address (which +28 # by construction has a shorter lifetime). +29 # +30 # Beginnings of a lattice of types: +31 # You can convert a ref or handle to an address, but not the other way around. +32 # You can convert addresses to ints, but not the other way around. +33 +34 _write: # fd : int, s : (address array byte) +35 # . prologue +36 55/push-ebp +37 89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp +38 # . save registers +39 50/push-eax +40 51/push-ecx +41 52/push-edx +42 53/push-ebx +43 # syscall(write, fd, (data) s+4, (size) *s) +44 # . fd : ebx +45 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 3/r32/ebx 8/disp8 . # copy *(ebp+8) to ebx +46 # . data : ecx = s+4 +47 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 1/r32/ecx 0xc/disp8 . # copy *(ebp+12) to ecx +48 81 0/subop/add 3/mod/direct 1/rm32/ecx . . . . . 4/imm32 # add to ecx +49 # . size : edx = *s +50 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 2/r32/edx 0xc/disp8 . # copy *(ebp+12) to edx +51 8b/copy 0/mod/indirect 2/rm32/edx . . . 2/r32/edx . . # copy *edx to edx +52 # . syscall +53 b8/copy-to-eax 4/imm32/write 54 cd/syscall 0x80/imm8 -55 # never gets here -56 -57 # . . vim:nowrap:textwidth=0 +55 # if (eax < 0) abort +56 3d/compare-eax-with 0/imm32 +57 0f 8c/jump-if-lesser $_write:abort/disp32 +58 $_write:end: +59 # . restore registers +60 5b/pop-to-ebx +61 5a/pop-to-edx +62 59/pop-to-ecx +63 58/pop-to-eax +64 # . epilogue +65 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp +66 5d/pop-to-ebp +67 c3/return +68 +69 $_write:abort: +70 # can't write a message here for risk of an infinite loop, so we'll use a special exit code instead +71 # . syscall(exit, 255) +72 bb/copy-to-ebx 0xff/imm32 +73 b8/copy-to-eax 1/imm32/exit +74 cd/syscall 0x80/imm8 +75 # never gets here +76 +77 # . . vim:nowrap:textwidth=0 -- cgit 1.4.1-2-gfad0