From 96a6bac52d6f4a67932e54d25166bf7961718e9d Mon Sep 17 00:00:00 2001 From: Kartik Agaram Date: Mon, 7 Jan 2019 13:36:15 -0800 Subject: 4914 --- html/subx/apps/crenshaw2-1.subx.html | 2 +- html/subx/apps/crenshaw2-1b.subx.html | 2 +- html/subx/apps/factorial.subx.html | 2 +- html/subx/apps/handle.subx.html | 338 +++++++++++++++++----------------- html/subx/apps/hex.subx.html | 2 +- 5 files changed, 171 insertions(+), 175 deletions(-) (limited to 'html/subx/apps') diff --git a/html/subx/apps/crenshaw2-1.subx.html b/html/subx/apps/crenshaw2-1.subx.html index de7cf5c0..34312bf0 100644 --- a/html/subx/apps/crenshaw2-1.subx.html +++ b/html/subx/apps/crenshaw2-1.subx.html @@ -109,7 +109,7 @@ if ('onhashchange' in window) { 46 68/push "test"/imm32 47 ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 . # push *(EBP+8) 48 # . . call - 49 e8/call kernel-string-equal/disp32 + 49 e8/call kernel-string-equal/disp32 50 # . . discard args 51 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP 52 # . check result diff --git a/html/subx/apps/crenshaw2-1b.subx.html b/html/subx/apps/crenshaw2-1b.subx.html index b059f0fc..cd692a32 100644 --- a/html/subx/apps/crenshaw2-1b.subx.html +++ b/html/subx/apps/crenshaw2-1b.subx.html @@ -109,7 +109,7 @@ if ('onhashchange' in window) { 46 68/push "test"/imm32 47 ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 . # push *(EBP+8) 48 # . . call - 49 e8/call kernel-string-equal/disp32 + 49 e8/call kernel-string-equal/disp32 50 # . . discard args 51 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP 52 # . check result diff --git a/html/subx/apps/factorial.subx.html b/html/subx/apps/factorial.subx.html index 2999bbe9..0beb2d21 100644 --- a/html/subx/apps/factorial.subx.html +++ b/html/subx/apps/factorial.subx.html @@ -92,7 +92,7 @@ if ('onhashchange' in window) { 31 68/push "test"/imm32 32 ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 . # push *(EBP+8) 33 # . . call - 34 e8/call kernel-string-equal/disp32 + 34 e8/call kernel-string-equal/disp32 35 # . . discard args 36 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP 37 # . check result diff --git a/html/subx/apps/handle.subx.html b/html/subx/apps/handle.subx.html index f0d9d792..cd0d569c 100644 --- a/html/subx/apps/handle.subx.html +++ b/html/subx/apps/handle.subx.html @@ -23,6 +23,7 @@ a { color:inherit; } .subxTest { color: #5f8700; } .Constant { color: #008787; } .Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; } +.subxH1Comment { color: #005faf; text-decoration: underline; } --> @@ -123,13 +124,13 @@ if ('onhashchange' in window) { 63 $new:continue: 64 # otherwise: 65 # ECX = *Next-alloc-id - 66 8b/copy 0/mod/indirect 5/rm32/.disp32 . . 1/r32/ECX Next-alloc-id/disp32 # copy *Next-alloc-id to ECX + 66 8b/copy 0/mod/indirect 5/rm32/.disp32 . . 1/r32/ECX Next-alloc-id/disp32 # copy *Next-alloc-id to ECX 67 # *EAX = *Next-alloc-id/ECX 68 89/copy 0/mod/indirect 0/rm32/EAX . . . 1/r32/ECX . . # copy ECX to *EAX 69 # out->alloc_id = *Next-alloc-id 70 89/copy 0/mod/indirect 2/rm32/EDX . . . 1/r32/ECX . . # copy ECX to *EDX 71 # increment *Next-alloc-id - 72 ff 0/subop/increment 0/mod/indirect 5/rm32/.disp32 . . . Next-alloc-id/disp32 # increment *Next-alloc-id + 72 ff 0/subop/increment 0/mod/indirect 5/rm32/.disp32 . . . Next-alloc-id/disp32 # increment *Next-alloc-id 73 $new:end: 74 # . restore registers 75 5a/pop-to-EDX @@ -145,7 +146,7 @@ if ('onhashchange' in window) { 85 55/push-EBP 86 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP 87 # *Next-alloc-id = 0x34 - 88 c7 0/subop/copy 0/mod/indirect 5/rm32/.disp32 . . . Next-alloc-id/disp32 0x34/imm32 # copy to *Next-alloc-id + 88 c7 0/subop/copy 0/mod/indirect 5/rm32/.disp32 . . . Next-alloc-id/disp32 0x34/imm32 # copy to *Next-alloc-id 89 # var handle/ECX = {0, 0} 90 68/push 0/imm32/address 91 68/push 0/imm32/alloc-id @@ -182,14 +183,14 @@ if ('onhashchange' in window) { 122 # . . push args 123 68/push "F - test-new: next alloc id"/imm32 124 68/push 0x35/imm32 -125 ff 6/subop/push 0/mod/indirect 5/rm32/.disp32 . . . Next-alloc-id/disp32 # copy to *Next-alloc-id +125 ff 6/subop/push 0/mod/indirect 5/rm32/.disp32 . . . Next-alloc-id/disp32 # copy to *Next-alloc-id 126 # . . call 127 e8/call check-ints-equal/disp32 128 # . . discard args 129 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP 130 # clean up 131 # . *Next-alloc-id = 1 -132 c7 0/subop/copy 0/mod/indirect 5/rm32/.disp32 . . . Next-alloc-id/disp32 1/imm32 # copy to *Next-alloc-id +132 c7 0/subop/copy 0/mod/indirect 5/rm32/.disp32 . . . Next-alloc-id/disp32 1/imm32 # copy to *Next-alloc-id 133 # . epilog 134 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP 135 5d/pop-to-EBP @@ -200,7 +201,7 @@ if ('onhashchange' in window) { 140 55/push-EBP 141 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP 142 # . *Next-alloc-id = 0x34 -143 c7 0/subop/copy 0/mod/indirect 5/rm32/.disp32 . . . Next-alloc-id/disp32 0x34/imm32 # copy to *Next-alloc-id +143 c7 0/subop/copy 0/mod/indirect 5/rm32/.disp32 . . . Next-alloc-id/disp32 0x34/imm32 # copy to *Next-alloc-id 144 # define an allocation-descriptor with no space left 145 # . var ad/EAX : (address allocation-descriptor) = {0x10, 0x10} 146 68/push 0x10/imm32/limit @@ -244,14 +245,14 @@ if ('onhashchange' in window) { 184 # . . push args 185 68/push "F - test-new-failure: next alloc id"/imm32 186 68/push 0x34/imm32 -187 ff 6/subop/push 0/mod/indirect 5/rm32/.disp32 . . . Next-alloc-id/disp32 # copy to *Next-alloc-id +187 ff 6/subop/push 0/mod/indirect 5/rm32/.disp32 . . . Next-alloc-id/disp32 # copy to *Next-alloc-id 188 # . . call 189 e8/call check-ints-equal/disp32 190 # . . discard args 191 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP 192 # clean up 193 # . *Next-alloc-id = 1 -194 c7 0/subop/copy 0/mod/indirect 5/rm32/.disp32 . . . Next-alloc-id/disp32 1/imm32 # copy to *Next-alloc-id +194 c7 0/subop/copy 0/mod/indirect 5/rm32/.disp32 . . . Next-alloc-id/disp32 1/imm32 # copy to *Next-alloc-id 195 # . epilog 196 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP 197 5d/pop-to-EBP @@ -261,169 +262,164 @@ if ('onhashchange' in window) { 201 # . prolog 202 55/push-EBP 203 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP -204 # . save registers -205 51/push-ECX -206 52/push-EDX -207 # ECX = handle -208 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 1/r32/ECX 8/disp8 . # copy *(EBP+8) to ECX -209 # EDX = handle->alloc_id -210 8b/copy 0/mod/indirect 1/rm32/ECX . . . 2/r32/EDX . . # copy *ECX to EDX -211 # EAX = handle->address -212 8b/copy 1/mod/*+disp8 1/rm32/ECX . . . 0/r32/EAX 4/disp8 . # copy *(ECX+4) to EAX -213 # if (*EAX == EDX) return -214 39/compare 0/mod/indirect 0/rm32/EAX . . . 2/r32/EDX . . # compare *EAX and EDX -215 74/jump-if-equal $lookup:success/disp8 -216 # otherwise print a message and exit -217 # hard-coded abort just to minimize args and simplify calls -218 # TODO: emit stack trace, etc. -219 # . _write(2/stderr, msg) -220 # . . push args -221 68/push "lookup failed"/imm32 -222 68/push 2/imm32/stderr -223 # . . call -224 e8/call _write/disp32 -225 # . . discard args -226 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP -227 # . syscall(exit, 1) -228 bb/copy-to-EBX 1/imm32/exit-status -229 b8/copy-to-EAX 1/imm32/exit -230 cd/syscall 0x80/imm8 -231 $lookup:success: -232 # increment past payload alloc id -233 05/add-to-EAX 4/imm32 -234 # . restore registers -235 5a/pop-to-EDX -236 59/pop-to-ECX -237 # . epilog -238 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP -239 5d/pop-to-EBP -240 c3/return -241 -242 test-lookup-success: -243 # . prolog -244 55/push-EBP -245 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP -246 # . save registers -247 # var handle/ECX = {0, 0} -248 68/push 0/imm32/address -249 68/push 0/imm32/alloc-id -250 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . . # copy ESP to ECX -251 # var old_top/EDX = Heap->curr -252 8b/copy 0/mod/indirect 5/rm32/.disp32 . . 2/r32/EDX Heap/disp32 . # copy *Heap to EDX -253 # new(Heap, 2, handle) -254 # . . push args -255 51/push-ECX -256 68/push 2/imm32/size -257 68/push Heap/imm32 -258 # . . call -259 e8/call new/disp32 -260 # . . discard args -261 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP -262 # EAX = lookup(handle) -263 # . . push args -264 51/push-ECX -265 # . . call -266 e8/call lookup/disp32 -267 # . . discard args -268 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -269 # EAX contains old top of Heap, except skipping the alloc id in the payload -270 # . check-ints-equal(EAX, old_top+4, msg) -271 # . . push args -272 68/push "F - test-lookup-success"/imm32 -273 81 0/subop/add 3/mod/direct 2/rm32/EDX . . . . . 4/imm32 # add to EDX -274 52/push-EDX -275 50/push-EAX -276 # . . call -277 e8/call check-ints-equal/disp32 -278 # . . discard args -279 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP -280 # clean up -281 # . *Next-alloc-id = 1 -282 c7 0/subop/copy 0/mod/indirect 5/rm32/.disp32 . . . Next-alloc-id/disp32 1/imm32 # copy to *Next-alloc-id -283 # . restore registers -284 5a/pop-to-EDX -285 59/pop-to-ECX -286 # . epilog -287 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP -288 5d/pop-to-EBP -289 c3/return -290 -291 test-lookup-failure: -292 # . prolog -293 55/push-EBP -294 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP -295 # . save registers -296 50/push-EAX -297 51/push-ECX -298 52/push-EDX -299 # var h1/ECX = {0, 0} -300 68/push 0/imm32/address -301 68/push 0/imm32/alloc-id -302 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . . # copy ESP to ECX -303 # var old_top/EBX = Heap->curr -304 8b/copy 0/mod/indirect 5/rm32/.disp32 . . 3/r32/EBX Heap/disp32 . # copy *Heap to EBX -305 # first allocation, to h1 -306 # . new(Heap, 2, h1) -307 # . . push args -308 51/push-ECX -309 68/push 2/imm32/size -310 68/push Heap/imm32 -311 # . . call -312 e8/call new/disp32 -313 # . . discard args -314 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP -315 # reset Heap->curr to mimic reclamation -316 89/copy 0/mod/indirect 5/rm32/.disp32 . . 3/r32/EBX Heap/disp32 . # copy EBX to *Heap -317 # second allocation that returns the same address as the first -318 # var h2/EDX = {0, 0} -319 68/push 0/imm32/address -320 68/push 0/imm32/alloc-id -321 89/copy 3/mod/direct 2/rm32/EDX . . . 4/r32/ESP . . # copy ESP to EDX -322 # . new(Heap, 2, h2) -323 # . . push args -324 52/push-EDX -325 68/push 2/imm32/size -326 68/push Heap/imm32 -327 # . . call -328 e8/call new/disp32 -329 # . . discard args -330 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP -331 # check-ints-equal(h1->address, h2->address, msg) -332 # . . push args -333 68/push "F - test-lookup-failure"/imm32 -334 ff 6/subop/push 1/mod/*+disp8 2/rm32/ECX . . . . 4/disp8 . # push *(EDX+4) -335 ff 6/subop/push 1/mod/*+disp8 1/rm32/ECX . . . . 4/disp8 . # push *(ECX+4) -336 # . . call -337 e8/call check-ints-equal/disp32 -338 # . . discard args -339 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP -340 # lookup(h1) should crash -341 # . . push args -342 51/push-ECX -343 # . . call -344 e8/call lookup/disp32 -345 # should never get past this point -346 # . . discard args -347 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP -348 # clean up -349 # . *Next-alloc-id = 1 -350 c7 0/subop/copy 0/mod/indirect 5/rm32/.disp32 . . . Next-alloc-id/disp32 1/imm32 # copy to *Next-alloc-id -351 # . restore registers -352 5a/pop-to-EDX -353 59/pop-to-ECX -354 58/pop-to-EAX -355 # . epilog -356 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP -357 5d/pop-to-EBP -358 c3/return -359 -360 == data -361 -362 # Monotonically increasing counter for calls to 'new' -363 Next-alloc-id: -364 01 00 00 00 # 1 -365 -366 # . . vim:nowrap:textwidth=0 +204 # - as a proof of concept for future inlining, uses no general-purpose registers besides the output (EAX) +205 # EAX = handle +206 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 0/r32/EAX 8/disp8 . # copy *(EBP+8) to EAX +207 # - inline { +208 # push handle->address +209 ff 6/subop/push 1/mod/*+disp8 1/rm32/ECX . . . . 4/disp8 . # push *(EAX+4) +210 # EAX = handle->alloc_id +211 8b/copy 0/mod/indirect 0/rm32/EAX . . . . . . # copy *EAX to EAX +212 # if (EAX != *ESP) abort +213 39/compare 0/mod/indirect 4/rm32/sib 4/base/ESP 4/index/none . 0/r32/EAX . . # compare *ESP and EAX +214 75/jump-if-not-equal $lookup:fail/disp8 +215 # return ESP+4 +216 58/pop-to-EAX +217 05/add-to-EAX 4/imm32 +218 # - } +219 # . epilog +220 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP +221 5d/pop-to-EBP +222 c3/return +223 $lookup:fail: +224 # . _write(2/stderr, msg) +225 # . . push args +226 68/push "lookup failed"/imm32 +227 68/push 2/imm32/stderr +228 # . . call +229 e8/call _write/disp32 +230 # . . discard args +231 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP +232 # . syscall(exit, 1) +233 bb/copy-to-EBX 1/imm32/exit-status +234 b8/copy-to-EAX 1/imm32/exit +235 cd/syscall 0x80/imm8 +236 +237 test-lookup-success: +238 # . prolog +239 55/push-EBP +240 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP +241 # . save registers +242 # var handle/ECX = {0, 0} +243 68/push 0/imm32/address +244 68/push 0/imm32/alloc-id +245 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . . # copy ESP to ECX +246 # var old_top/EDX = Heap->curr +247 8b/copy 0/mod/indirect 5/rm32/.disp32 . . 2/r32/EDX Heap/disp32 . # copy *Heap to EDX +248 # new(Heap, 2, handle) +249 # . . push args +250 51/push-ECX +251 68/push 2/imm32/size +252 68/push Heap/imm32 +253 # . . call +254 e8/call new/disp32 +255 # . . discard args +256 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +257 # EAX = lookup(handle) +258 # . . push args +259 51/push-ECX +260 # . . call +261 e8/call lookup/disp32 +262 # . . discard args +263 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +264 # EAX contains old top of Heap, except skipping the alloc id in the payload +265 # . check-ints-equal(EAX, old_top+4, msg) +266 # . . push args +267 68/push "F - test-lookup-success"/imm32 +268 81 0/subop/add 3/mod/direct 2/rm32/EDX . . . . . 4/imm32 # add to EDX +269 52/push-EDX +270 50/push-EAX +271 # . . call +272 e8/call check-ints-equal/disp32 +273 # . . discard args +274 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +275 # clean up +276 # . *Next-alloc-id = 1 +277 c7 0/subop/copy 0/mod/indirect 5/rm32/.disp32 . . . Next-alloc-id/disp32 1/imm32 # copy to *Next-alloc-id +278 # . restore registers +279 5a/pop-to-EDX +280 59/pop-to-ECX +281 # . epilog +282 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP +283 5d/pop-to-EBP +284 c3/return +285 +286 test-lookup-failure: +287 # . prolog +288 55/push-EBP +289 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP +290 # . save registers +291 50/push-EAX +292 51/push-ECX +293 52/push-EDX +294 # var h1/ECX = {0, 0} +295 68/push 0/imm32/address +296 68/push 0/imm32/alloc-id +297 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . . # copy ESP to ECX +298 # var old_top/EBX = Heap->curr +299 8b/copy 0/mod/indirect 5/rm32/.disp32 . . 3/r32/EBX Heap/disp32 . # copy *Heap to EBX +300 # first allocation, to h1 +301 # . new(Heap, 2, h1) +302 # . . push args +303 51/push-ECX +304 68/push 2/imm32/size +305 68/push Heap/imm32 +306 # . . call +307 e8/call new/disp32 +308 # . . discard args +309 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +310 # reset Heap->curr to mimic reclamation +311 89/copy 0/mod/indirect 5/rm32/.disp32 . . 3/r32/EBX Heap/disp32 . # copy EBX to *Heap +312 # second allocation that returns the same address as the first +313 # var h2/EDX = {0, 0} +314 68/push 0/imm32/address +315 68/push 0/imm32/alloc-id +316 89/copy 3/mod/direct 2/rm32/EDX . . . 4/r32/ESP . . # copy ESP to EDX +317 # . new(Heap, 2, h2) +318 # . . push args +319 52/push-EDX +320 68/push 2/imm32/size +321 68/push Heap/imm32 +322 # . . call +323 e8/call new/disp32 +324 # . . discard args +325 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +326 # check-ints-equal(h1->address, h2->address, msg) +327 # . . push args +328 68/push "F - test-lookup-failure"/imm32 +329 ff 6/subop/push 1/mod/*+disp8 2/rm32/ECX . . . . 4/disp8 . # push *(EDX+4) +330 ff 6/subop/push 1/mod/*+disp8 1/rm32/ECX . . . . 4/disp8 . # push *(ECX+4) +331 # . . call +332 e8/call check-ints-equal/disp32 +333 # . . discard args +334 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 0xc/imm32 # add to ESP +335 # lookup(h1) should crash +336 # . . push args +337 51/push-ECX +338 # . . call +339 e8/call lookup/disp32 +340 # should never get past this point +341 # . . discard args +342 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP +343 # clean up +344 # . *Next-alloc-id = 1 +345 c7 0/subop/copy 0/mod/indirect 5/rm32/.disp32 . . . Next-alloc-id/disp32 1/imm32 # copy to *Next-alloc-id +346 # . restore registers +347 5a/pop-to-EDX +348 59/pop-to-ECX +349 58/pop-to-EAX +350 # . epilog +351 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP +352 5d/pop-to-EBP +353 c3/return +354 +355 == data +356 +357 # Monotonically increasing counter for calls to 'new' +358 Next-alloc-id: +359 01 00 00 00 # 1 +360 +361 # . . vim:nowrap:textwidth=0 diff --git a/html/subx/apps/hex.subx.html b/html/subx/apps/hex.subx.html index 17d17854..2980f7e8 100644 --- a/html/subx/apps/hex.subx.html +++ b/html/subx/apps/hex.subx.html @@ -97,7 +97,7 @@ if ('onhashchange' in window) { 34 68/push "test"/imm32 35 ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 . # push *(EBP+8) 36 # . . call - 37 e8/call kernel-string-equal/disp32 + 37 e8/call kernel-string-equal/disp32 38 # . . discard args 39 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP 40 # . check result -- cgit 1.4.1-2-gfad0