1 # Comparing 'regular' length-prefixed strings. 2 3 == code 4 # instruction effective address register displacement immediate 5 # . op subop mod rm32 base index scale r32 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: # run all tests 9 #? e8/call test-compare-equal-strings/disp32 10 e8/call run-tests/disp32 # 'run-tests' is a function created automatically by SubX. It calls all functions that start with 'test-'. 11 # syscall(exit, Num-test-failures) 12 8b/copy 0/mod/indirect 5/rm32/.disp32 . . 3/r32/EBX Num-test-failures/disp32 # copy *Num-test-failures to EBX 13 b8/copy-to-EAX 1/imm32/exit 14 cd/syscall 0x80/imm8 15 16 string-equal?: # s : (address string), benchmark : (address string) -> EAX : boolean 17 # pseudocode: 18 # lens = s->length 19 # if (lens != benchmark->length) return false 20 # i = 0 21 # currs = s->data 22 # currb = benchmark->data 23 # while i < s->length 24 # c1 = *currs 25 # c2 = *currb 26 # if (c1 != c2) return false 27 # ++i, ++currs, ++currb 28 # return true 29 # 30 # registers: 31 # i: ECX 32 # lens: EDX 33 # currs: ESI 34 # currb: EDI 35 # c1: EAX 36 # c2: EBX 37 # 38 # . prolog 39 55/push-EBP 40 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP 41 # . save registers 42 51/push-ECX 43 52/push-EDX 44 53/push-EBX 45 56/push-ESI 46 57/push-EDI 47 # ESI = s 48 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 6/r32/ESI 8/disp8 . # copy *(EBP+8) to ESI 49 # EDI = benchmark 50 8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 7/r32/EDI 0xc/disp8 . # copy *(EBP+12) to EDI 51 # lens/EDX = s->length 52 8b/copy 0/mod/indirect 6/rm32/ESI . . . 2/r32/EDX . . # copy *ESI to EDX 53 $string-equal?:lengths: 54 # if (lens != benchmark->length) return false 55 39/compare 0/mod/indirect 7/rm32/EDI . . . 2/r32/EDX . . # compare *EDI and EDX 56 75/jump-if-not-equal $string-equal?:false/disp8 57 # currs/ESI = s->data 58 81 0/subop/add 3/mod/direct 6/rm32/ESI . . . . . 4/imm32 # add to ESI 59 # currb/EDI = benchmark->data 60 81 0/subop/add 3/mod/direct 7/rm32/EDI . . . . . 4/imm32 # add to EDI 61 # i/ECX = c1/EAX = c2/EBX = 0 62 31/xor 3/mod/direct 1/rm32/ECX . . . 1/r32/ECX . . # clear ECX 63 31/xor 3/mod/direct 0/rm32/EAX . . . 0/r32/EAX . . # clear EAX 64 31/xor 3/mod/direct 3/rm32/EBX . . . 3/r32/EBX . . # clear EBX 65 $string-equal?:loop: 66 # if (i >= lens) return true 67 39/compare 3/mod/direct 1/rm32/ECX . . . 2/r32/EDX . . # compare ECX with EDX 68 7d/jump-if-greater-or-equal $string-equal?:true/disp8 69 # c1 = *currs 70 8a/copy-byte 0/mod/indirect 6/rm32/ESI . . . 0/r32/AL . . # copy byte at *ESI to AL 71 # c2 = *currb 72 8a/copy-byte 0/mod/indirect 7/rm32/EDI . . . 3/r32/BL . . # copy byte at *EDI to BL 73 # if (c1 != c2) return false 74 39/compare 3/mod/direct 0/rm32/EAX . .<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html><head><title>Python: module ranger.ext.human_readable</title> </head><body bgcolor="#f0f0f8"> <table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading"> <tr bgcolor="#7799ee"> <td valign=bottom> <br> <font color="#ffffff" face="helvetica, arial"> <br><big><big><strong><a href="ranger.html"><font color="#ffffff">ranger</font></a>.<a href="ranger.ext.html"><font color="#ffffff">ext</font></a>.human_readable</strong></big></big></font></td ><td align=right valign=bottom ><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/home/hut/ranger/ranger/ext/human_readable.py">/home/hut/ranger/ranger/ext/human_readable.py</a></font></td></tr></table> <p><tt># Copyright (C) 2009, 2010 Roman Zimbelmann <romanz@lavabit.com><br> #<br> # This program is free software: you can redistribute it and/or modify<br> # it under the terms of the GNU General Public License as published by<br> # the Free Software Foundation, either version 3 of the License, or<br> # (at your option) any later version.<