From a0d3cac4e69101669681a4d8af6dc3e8bd2c9a6a Mon Sep 17 00:00:00 2001 From: Kartik Agaram Date: Sun, 15 Sep 2019 00:01:26 -0700 Subject: 5659 --- html/examples/ex8.subx.html | 59 ++++++++++++++++++++++----------------------- 1 file changed, 29 insertions(+), 30 deletions(-) (limited to 'html/examples/ex8.subx.html') diff --git a/html/examples/ex8.subx.html b/html/examples/ex8.subx.html index d7aa39b5..29fd713d 100644 --- a/html/examples/ex8.subx.html +++ b/html/examples/ex8.subx.html @@ -60,7 +60,7 @@ if ('onhashchange' in window) { 1 # Example reading commandline arguments: compute length of first arg. 2 # 3 # To run: - 4 # $ ./subx translate examples/ex8.subx -o examples/ex8 + 4 # $ ./subx translate init.linux examples/ex8.subx -o examples/ex8 5 # $ ./subx run examples/ex8 abc de fghi 6 # Expected result: 7 # $ echo $? @@ -73,7 +73,7 @@ if ('onhashchange' in window) { 14 # ... 15 # Locals start from esp-4 downwards. 16 -17 == code 0x09000000 +17 == code 18 # instruction effective address register displacement immediate 19 # . op subop mod rm32 base index scale r32 20 # . 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 @@ -85,39 +85,38 @@ if ('onhashchange' in window) { 26 # . . push args 27 ff 6/subop/push 1/mod/*+disp8 5/rm32/ebp . . . . 8/disp8 . # push *(ebp+8) 28 # . . call -29 e8/call ascii-length/disp32 +29 e8/call ascii-length/disp32 30 # . . discard args 31 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp 32 33 # exit(eax) 34 89/copy 3/mod/direct 3/rm32/ebx . . . 0/r32/eax . . # copy eax to ebx -35 b8/copy-to-eax 1/imm32/exit -36 cd/syscall 0x80/imm8 -37 -38 ascii-length: # s : (address array byte) -> n/eax -39 # edx = s -40 8b/copy 1/mod/*+disp8 4/rm32/sib 4/base/esp 4/index/none . 2/r32/edx 4/disp8 . # copy *(esp+4) to edx -41 # var result/eax = 0 -42 b8/copy-to-eax 0/imm32 -43 $ascii-length:loop: -44 # var c/ecx = *s -45 8a/copy-byte 0/mod/* 2/rm32/edx . . . 1/r32/CL . . # copy byte at *edx to CL -46 # if (c == '\0') break -47 81 7/subop/compare 3/mod/direct 1/rm32/ecx . . . . . 0/imm32 # compare ecx -48 74/jump-if-equal $ascii-length:end/disp8 -49 # ++s -50 42/increment-edx -51 # ++result -52 40/increment-eax -53 # loop -54 eb/jump $ascii-length:loop/disp8 -55 $ascii-length:end: -56 # return eax -57 c3/return -58 -59 == data 0x0a000000 -60 -61 # . . vim:nowrap:textwidth=0 +35 e8/call syscall_exit/disp32 +36 +37 ascii-length: # s : (address array byte) -> n/eax +38 # edx = s +39 8b/copy 1/mod/*+disp8 4/rm32/sib 4/base/esp 4/index/none . 2/r32/edx 4/disp8 . # copy *(esp+4) to edx +40 # var result/eax = 0 +41 b8/copy-to-eax 0/imm32 +42 $ascii-length:loop: +43 # var c/ecx = *s +44 8a/copy-byte 0/mod/* 2/rm32/edx . . . 1/r32/CL . . # copy byte at *edx to CL +45 # if (c == '\0') break +46 81 7/subop/compare 3/mod/direct 1/rm32/ecx . . . . . 0/imm32 # compare ecx +47 74/jump-if-equal $ascii-length:end/disp8 +48 # ++s +49 42/increment-edx +50 # ++result +51 40/increment-eax +52 # loop +53 eb/jump $ascii-length:loop/disp8 +54 $ascii-length:end: +55 # return eax +56 c3/return +57 +58 == data +59 +60 # . . vim:nowrap:textwidth=0 -- cgit 1.4.1-2-gfad0