summary refs log tree commit diff stats
path: root/compiler/scriptconfig.nim
blob: db60dafcceb82357d024dc49f4f2a4ba7d6c7900 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
#
#
#           The Nim Compiler
#        (c) Copyright 2015 Andreas Rumpf
#
#    See the file "copying.txt", included in this
#    distribution, for details about the copyright.
#

## Implements the new configuration system for Nim. Uses Nim as a scripting
## language.

import
  ast, modules, idents, passes, passaux, condsyms,
  options, nimconf, sem, semdata, llstream, vm, vmdef, commands, msgs,
  os, times, osproc, wordrecg, strtabs, modulegraphs, lineinfos, pathutils

# we support 'cmpIgnoreStyle' natively for efficiency:
from strutils import cmpIgnoreStyle, contains

proc listDirs(a: VmArgs, filter: set[PathComponent]) =
  let dir = getString(a, 0)
  var result: seq[string] = @[]
  for kind, path in walkDir(dir):
    if kind in filter: result.add path
  setResult(a, result)

proc setupVM*(module: PSym; cache: IdentCache; scriptName: string;
              graph: ModuleGraph): PEvalContext =
  # For Nimble we need to export 'setupVM'.
  result = newCtx(module, cache, graph)
  result.mode = emRepl
  registerAdditionalOps(result)
  let conf = graph.config

  # captured vars:
  var errorMsg: string
  var vthisDir = scriptName.splitFile.dir

  template cbconf(name, body) {.dirty.} =
    result.registerCallback "stdlib.system." & astToStr(name),
      proc (a: VmArgs) =
        body

  template cbexc(name, exc, body) {.dirty.} =
    result.registerCallback "stdlib.system." & astToStr(name),
      proc (a: VmArgs) =
        errorMsg = ""
        try:
          body
        except exc:
          errorMsg = getCurrentExceptionMsg()

  template cbos(name, body) {.dirty.} =
    cbexc(name, OSError, body)

  # Idea: Treat link to file as a file, but ignore link to directory to prevent
  # endless recursions out of the box.
  cbos listFiles:
    listDirs(a, {pcFile, pcLinkToFile})
  cbos listDirs:
    listDirs(a, {pcDir})
  cbos removeDir:
    os.removeDir getString(a, 0)
  cbos removeFile:
    os.removeFile getString(a, 0)
  cbos createDir:
    os.createDir getString(a, 0)

  result.registerCallback "stdlib.system.getError",
    proc (a: VmArgs) = setResult(a, errorMsg)

  cbos setCurrentDir:
    os.setCurrentDir getString(a, 0)
  cbos getCurrentDir:
    setResult(a, os.getCurrentDir())
  cbos moveFile:
    os.moveFile(getString(a, 0), getString(a, 1))
  cbos moveDir:
    os.moveDir(getString(a, 0), getString(a, 1))
  cbos copyFile:
    os.copyFile(getString(a, 0), getString(a, 1))
  cbos copyDir:
    os.copyDir(getString(a, 0), getString(a, 1))
  cbos getLastModificationTime:
    setResult(a, getLastModificationTime(getString(a, 0)).toUnix)
  cbos findExe:
    setResult(a, os.findExe(getString(a, 0)))

  cbos rawExec:
    setResult(a, osproc.execCmd getString(a, 0))

  cbconf getEnv:
    setResult(a, os.getEnv(a.getString 0, a.getString 1))
  cbconf existsEnv:
    setResult(a, os.existsEnv(a.getString 0))
  cbconf putEnv:
    os.putEnv(a.getString 0, a.getString 1)
  cbconf dirExists:
    setResult(a, os.dirExists(a.getString 0))
  cbconf fileExists:
    setResult(a, os.fileExists(a.getString 0))

  cbconf projectName:
    setResult(a, conf.projectName)
  cbconf projectDir:
    setResult(a, conf.projectPath.string)
  cbconf projectPath:
    setResult(a, conf.projectFull.string)
  cbconf thisDir:
    setResult(a, vthisDir)
  cbconf put:
    options.setConfigVar(conf, getString(a, 0), getString(a, 1))
  cbconf get:
    setResult(a, options.getConfigVar(conf, a.getString 0))
  cbconf exists:
    setResult(a, options.existsConfigVar(conf, a.getString 0))
  cbconf nimcacheDir:
    setResult(a, options.getNimcacheDir(conf).string)
  cbconf paramStr:
    setResult(a, os.paramStr(int a.getInt 0))
  cbconf paramCount:
    setResult(a, os.paramCount())
  cbconf cmpIgnoreStyle:
    setResult(a, strutils.cmpIgnoreStyle(a.getString 0, a.getString 1))
  cbconf cmpIgnoreCase:
    setResult(a, strutils.cmpIgnoreCase(a.getString 0, a.getString 1))
  cbconf setCommand:
    conf.command = a.getString 0
    let arg = a.getString 1
    incl(conf.globalOptions, optWasNimscript)
    if arg.len > 0:
      conf.projectName = arg
      let path =
        if conf.projectName.isAbsolute: AbsoluteFile(conf.projectName)
        else: conf.projectPath / RelativeFile(conf.projectName)
      try:
        conf.projectFull = canonicalizePath(conf, path)
      except OSError:
        conf.projectFull = path
  cbconf getCommand:
    setResult(a, conf.command)
  cbconf switch:
    processSwitch(a.getString 0, a.getString 1, passPP, module.info, conf)
  cbconf hintImpl:
    processSpecificNote(a.getString 0, wHint, passPP, module.info,
      a.getString 1, conf)
  cbconf warningImpl:
    processSpecificNote(a.getString 0, wWarning, passPP, module.info,
      a.getString 1, conf)
  cbconf patchFile:
    let key = a.getString(0) & "_" & a.getString(1)
    var val = a.getString(2).addFileExt(NimExt)
    if {'$', '~'} in val:
      val = pathSubs(conf, val, vthisDir)
    elif not isAbsolute(val):
      val = vthisDir / val
    conf.moduleOverrides[key] = val
  cbconf selfExe:
    setResult(a, os.getAppFilename())
  cbconf cppDefine:
    options.cppDefine(conf, a.getString(0))
  cbexc stdinReadLine, EOFError:
    setResult(a, "")
    setResult(a, stdin.readLine())
  cbexc stdinReadAll, EOFError:
    setResult(a, "")
    setResult(a, stdin.readAll())

proc runNimScript*(cache: IdentCache; scriptName: AbsoluteFile;
                   freshDefines=true; conf: ConfigRef) =
  rawMessage(conf, hintConf, scriptName.string)
  let oldSymbolFiles = conf.symbolFiles
  conf.symbolFiles = disabledSf

  let graph = newModuleGraph(cache, conf)
  connectCallbacks(graph)
  if freshDefines: initDefines(conf.symbols)

  defineSymbol(conf.symbols, "nimscript")
  defineSymbol(conf.symbols, "nimconfig")
  registerPass(graph, semPass)
  registerPass(graph, evalPass)

  conf.searchPaths.add(conf.libpath)

  var m = graph.makeModule(scriptName)
  incl(m.flags, sfMainModule)
  graph.vm = setupVM(m, cache, scriptName.string, graph)

  graph.compileSystemModule() # TODO: see why this unsets hintConf in conf.notes
  discard graph.processModule(m, llStreamOpen(scriptName, fmRead))

  # ensure we load 'system.nim' again for the real non-config stuff!
  resetSystemArtifacts(graph)
  # do not remove the defined symbols
  #initDefines()
  undefSymbol(conf.symbols, "nimscript")
  undefSymbol(conf.symbols, "nimconfig")
  conf.symbolFiles = oldSymbolFiles
>TRenderTokSeq* = seq[TRenderTok] TSrcGen* = object indent*: int lineLen*: int pos*: int # current position for iteration over the buffer idx*: int # current token index for iteration over the buffer tokens*: TRenderTokSeq buf*: string pendingNL*: int # negative if not active; else contains the # indentation value pendingWhitespace: int comStack*: seq[PNode] # comment stack flags*: TRenderFlags inGenericParams: bool checkAnon: bool # we're in a context that can contain sfAnon inPragma: int when defined(nimpretty): pendingNewlineCount: int fid*: FileIndex # We render the source code in a two phases: The first # determines how long the subtree will likely be, the second # phase appends to a buffer that will be the output. proc isKeyword*(i: PIdent): bool = if (i.id >= ord(tokKeywordLow) - ord(tkSymbol)) and (i.id <= ord(tokKeywordHigh) - ord(tkSymbol)): result = true proc renderDefinitionName*(s: PSym, noQuotes = false): string = ## Returns the definition name of the symbol. ## ## If noQuotes is false the symbol may be returned in backticks. This will ## happen if the name happens to be a keyword or the first character is not ## part of the SymStartChars set. let x = s.name.s if noQuotes or (x[0] in SymStartChars and not renderer.isKeyword(s.name)): result = x else: result = '`' & x & '`' when not defined(nimpretty): const IndentWidth = 2 longIndentWid = IndentWidth * 2 else: template IndentWidth: untyped = lexer.gIndentationWidth template longIndentWid: untyped = IndentWidth() * 2 proc minmaxLine(n: PNode): (int, int) = case n.kind of nkTripleStrLit: result = (n.info.line.int, n.info.line.int + countLines(n.strVal)) of nkCommentStmt: result = (n.info.line.int, n.info.line.int + countLines(n.comment)) else: result = (n.info.line.int, n.info.line.int) for i in 0 ..< safeLen(n): let (currMin, currMax) = minmaxLine(n[i]) if currMin < result[0]: result[0] = currMin if currMax > result[1]: result[1] = currMax proc lineDiff(a, b: PNode): int = result = minmaxLine(b)[0] - minmaxLine(a)[1] const MaxLineLen = 80 LineCommentColumn = 30 proc initSrcGen(g: var TSrcGen, renderFlags: TRenderFlags) = g.comStack = @[] g.tokens = @[] g.indent = 0 g.lineLen = 0 g.pos = 0 g.idx = 0 g.buf = "" g.flags = renderFlags g.pendingNL = -1 g.pendingWhitespace = -1 g.inGenericParams = false proc addTok(g: var TSrcGen, kind: TTokType, s: string) = var length = len(g.tokens) setLen(g.tokens, length + 1) g.tokens[length].kind = kind g.tokens[length].length = int16(len(s)) add(g.buf, s) proc addPendingNL(g: var TSrcGen) = if g.pendingNL >= 0: when defined(nimpretty): let newlines = repeat("\n", clamp(g.pendingNewlineCount, 1, 3)) else: const newlines = "\n" addTok(g, tkSpaces, newlines & spaces(g.pendingNL)) g.lineLen = g.pendingNL g.pendingNL = - 1 g.pendingWhitespace = -1 elif g.pendingWhitespace >= 0: addTok(g, tkSpaces, spaces(g.pendingWhitespace)) g.pendingWhitespace = -1 proc putNL(g: var TSrcGen, indent: int) = if g.pendingNL >= 0: addPendingNL(g) else: addTok(g, tkSpaces, "\n") g.pendingNL = indent g.lineLen = indent g.pendingWhitespace = -1 proc previousNL(g: TSrcGen): bool = result = g.pendingNL >= 0 or (g.tokens.len > 0 and g.tokens[^1].kind == tkSpaces) proc putNL(g: var TSrcGen) = putNL(g, g.indent) proc optNL(g: var TSrcGen, indent: int) = g.pendingNL = indent g.lineLen = indent when defined(nimpretty): g.pendingNewlineCount = 0 proc optNL(g: var TSrcGen) = optNL(g, g.indent) proc optNL(g: var TSrcGen; a, b: PNode) = g.pendingNL = g.indent g.lineLen = g.indent when defined(nimpretty): g.pendingNewlineCount = lineDiff(a, b) proc indentNL(g: var TSrcGen) = inc(g.indent, IndentWidth) g.pendingNL = g.indent g.lineLen = g.indent proc dedent(g: var TSrcGen) = dec(g.indent, IndentWidth) assert(g.indent >= 0) if g.pendingNL > IndentWidth: dec(g.pendingNL, IndentWidth) dec(g.lineLen, IndentWidth) proc put(g: var TSrcGen, kind: TTokType, s: string) = if kind != tkSpaces: addPendingNL(g) if len(s) > 0: addTok(g, kind, s) inc(g.lineLen, len(s)) else: g.pendingWhitespace = s.len proc putComment(g: var TSrcGen, s: string) = if s.isNil: return var i = 0 let hi = len(s) - 1 var isCode = (len(s) >= 2) and (s[1] != ' ') var ind = g.lineLen var com = "## " while i <= hi: case s[i] of '\0': break of '\x0D': put(g, tkComment, com) com = "## " inc(i) if s[i] == '\x0A': inc(i) optNL(g, ind) of '\x0A': put(g, tkComment, com) com = "## " inc(i) optNL(g, ind) of ' ', '\x09': add(com, s[i]) inc(i) else: # we may break the comment into a multi-line comment if the line # gets too long: # compute length of the following word: var j = i while j <= hi and s[j] > ' ': inc(j) if not isCode and (g.lineLen + (j - i) > MaxLineLen): put(g, tkComment, com) optNL(g, ind) com = "## " while i <= hi and s[i] > ' ': add(com, s[i]) inc(i) put(g, tkComment, com) optNL(g) proc maxLineLength(s: string): int = if s.isNil: return 0 var i = 0 let hi = len(s) - 1 var lineLen = 0 while i <= hi: case s[i] of '\0': break of '\x0D': inc(i) if s[i] == '\x0A': inc(i) result = max(result, lineLen) lineLen = 0 of '\x0A': inc(i) result = max(result, lineLen) lineLen = 0 else: inc(lineLen) inc(i) proc putRawStr(g: var TSrcGen, kind: TTokType, s: string) = var i = 0 let hi = len(s) - 1 var str = "" while i <= hi: case s[i] of '\x0D': put(g, kind, str) str = "" inc(i) if (i <= hi) and (s[i] == '\x0A'): inc(i) optNL(g, 0) of '\x0A': put(g, kind, str) str = "" inc(i) optNL(g, 0) else: add(str, s[i]) inc(i) put(g, kind, str) proc containsNL(s: string): bool = for i in countup(0, len(s) - 1): case s[i] of '\x0D', '\x0A': return true else: discard result = false proc pushCom(g: var TSrcGen, n: PNode) = var length = len(g.comStack) setLen(g.comStack, length + 1) g.comStack[length] = n proc popAllComs(g: var TSrcGen) = setLen(g.comStack, 0) const Space = " " proc shouldRenderComment(g: var TSrcGen, n: PNode): bool = result = false if n.comment != nil: result = (renderNoComments notin g.flags) or (renderDocComments in g.flags) proc gcom(g: var TSrcGen, n: PNode) = assert(n != nil) if shouldRenderComment(g, n): if (g.pendingNL < 0) and (len(g.buf) > 0) and (g.buf[len(g.buf)-1] != ' '): put(g, tkSpaces, Space) # Before long comments we cannot make sure that a newline is generated, # because this might be wrong. But it is no problem in practice. if (g.pendingNL < 0) and (len(g.buf) > 0) and (g.lineLen < LineCommentColumn): var ml = maxLineLength(n.comment) if ml + LineCommentColumn <= MaxLineLen: put(g, tkSpaces, spaces(LineCommentColumn - g.lineLen)) putComment(g, n.comment) #assert(g.comStack[high(g.comStack)] = n); proc gcoms(g: var TSrcGen) = for i in countup(0, high(g.comStack)): gcom(g, g.comStack[i]) popAllComs(g) proc lsub(g: TSrcGen; n: PNode): int proc litAux(g: TSrcGen; n: PNode, x: BiggestInt, size: int): string = proc skip(t: PType): PType = result = t while result.kind in {tyGenericInst, tyRange, tyVar, tyLent, tyDistinct, tyOrdinal, tyAlias, tySink}: result = lastSon(result) if n.typ != nil and n.typ.skip.kind in {tyBool, tyEnum}: let enumfields = n.typ.skip.n # we need a slow linear search because of enums with holes: for e in items(enumfields): if e.sym.position == x: return e.sym.name.s if nfBase2 in n.flags: result = "0b" & toBin(x, size * 8) elif nfBase8 in n.flags: result = "0o" & toOct(x, size * 3) elif nfBase16 in n.flags: result = "0x" & toHex(x, size * 2) else: result = $x proc ulitAux(g: TSrcGen; n: PNode, x: BiggestInt, size: int): string = if nfBase2 in n.flags: result = "0b" & toBin(x, size * 8) elif nfBase8 in n.flags: result = "0o" & toOct(x, size * 3) elif nfBase16 in n.flags: result = "0x" & toHex(x, size * 2) else: result = $x # XXX proper unsigned output! proc atom(g: TSrcGen; n: PNode): string = when defined(nimpretty): let comment = if n.info.commentOffsetA < n.info.commentOffsetB: " " & fileSection(g.fid, n.info.commentOffsetA, n.info.commentOffsetB) else: "" if n.info.offsetA <= n.info.offsetB: # for some constructed tokens this can not be the case and we're better # off to not mess with the offset then. return fileSection(g.fid, n.info.offsetA, n.info.offsetB) & comment var f: float32 case n.kind of nkEmpty: result = "" of nkIdent: result = n.ident.s of nkSym: result = n.sym.name.s of nkStrLit: result = ""; result.addQuoted(n.strVal) of nkRStrLit: result = "r\"" & replace(n.strVal, "\"", "\"\"") & '\"' of nkTripleStrLit: result = "\"\"\"" & n.strVal & "\"\"\"" of nkCharLit: result = "\'" result.addEscapedChar(chr(int(n.intVal))); result.add '\'' of nkIntLit: result = litAux(g, n, n.intVal, 4) of nkInt8Lit: result = litAux(g, n, n.intVal, 1) & "\'i8" of nkInt16Lit: result = litAux(g, n, n.intVal, 2) & "\'i16" of nkInt32Lit: result = litAux(g, n, n.intVal, 4) & "\'i32" of nkInt64Lit: result = litAux(g, n, n.intVal, 8) & "\'i64" of nkUIntLit: result = ulitAux(g, n, n.intVal, 4) & "\'u" of nkUInt8Lit: result = ulitAux(g, n, n.intVal, 1) & "\'u8" of nkUInt16Lit: result = ulitAux(g, n, n.intVal, 2) & "\'u16" of nkUInt32Lit: result = ulitAux(g, n, n.intVal, 4) & "\'u32" of nkUInt64Lit: result = ulitAux(g, n, n.intVal, 8) & "\'u64" of nkFloatLit: if n.flags * {nfBase2, nfBase8, nfBase16} == {}: result = $(n.floatVal) else: result = litAux(g, n, (cast[PInt64](addr(n.floatVal)))[] , 8) of nkFloat32Lit: if n.flags * {nfBase2, nfBase8, nfBase16} == {}: result = $n.floatVal & "\'f32" else: f = n.floatVal.float32 result = litAux(g, n, (cast[PInt32](addr(f)))[], 4) & "\'f32" of nkFloat64Lit: if n.flags * {nfBase2, nfBase8, nfBase16} == {}: result = $n.floatVal & "\'f64" else: result = litAux(g, n, (cast[PInt64](addr(n.floatVal)))[], 8) & "\'f64" of nkNilLit: result = "nil" of nkType: if (n.typ != nil) and (n.typ.sym != nil): result = n.typ.sym.name.s else: result = "[type node]" else: internalError("rnimsyn.atom " & $n.kind) result = "" proc lcomma(g: TSrcGen; n: PNode, start: int = 0, theEnd: int = - 1): int = assert(theEnd < 0) result = 0 for i in countup(start, sonsLen(n) + theEnd): inc(result, lsub(g, n.sons[i])) inc(result, 2) # for ``, `` if result > 0: dec(result, 2) # last does not get a comma! proc lsons(g: TSrcGen; n: PNode, start: int = 0, theEnd: int = - 1): int = assert(theEnd < 0) result = 0 for i in countup(start, sonsLen(n) + theEnd): inc(result, lsub(g, n.sons[i])) proc lsub(g: TSrcGen; n: PNode): int = # computes the length of a tree if isNil(n): return 0 if n.comment != nil: return MaxLineLen + 1 case n.kind of nkEmpty: result = 0 of nkTripleStrLit: if containsNL(n.strVal): result = MaxLineLen + 1 else: result = len(atom(g, n)) of succ(nkEmpty)..pred(nkTripleStrLit), succ(nkTripleStrLit)..nkNilLit: result = len(atom(g, n)) of nkCall, nkBracketExpr, nkCurlyExpr, nkConv, nkPattern, nkObjConstr: result = lsub(g, n.sons[0]) + lcomma(g, n, 1) + 2 of nkHiddenStdConv, nkHiddenSubConv, nkHiddenCallConv: result = lsub(g, n[1]) of nkCast: result = lsub(g, n.sons[0]) + lsub(g, n.sons[1]) + len("cast[]()") of nkAddr: result = (if n.len>0: lsub(g, n.sons[0]) + len("addr()") else: 4) of nkStaticExpr: result = lsub(g, n.sons[0]) + len("static_") of nkHiddenAddr, nkHiddenDeref: result = lsub(g, n.sons[0]) of nkCommand: result = lsub(g, n.sons[0]) + lcomma(g, n, 1) + 1 of nkExprEqExpr, nkAsgn, nkFastAsgn: result = lsons(g, n) + 3 of nkPar, nkCurly, nkBracket, nkClosure: result = lcomma(g, n) + 2 of nkTupleConstr: # assume the trailing comma: result = lcomma(g, n) + 3 of nkArgList: result = lcomma(g, n) of nkTableConstr: result = if n.len > 0: lcomma(g, n) + 2 else: len("{:}") of nkClosedSymChoice, nkOpenSymChoice: result = lsons(g, n) + len("()") + sonsLen(n) - 1 of nkTupleTy: result = lcomma(g, n) + len("tuple[]") of nkTupleClassTy: result = len("tuple") of nkDotExpr: result = lsons(g, n) + 1 of nkBind: result = lsons(g, n) + len("bind_") of nkBindStmt: result = lcomma(g, n) + len("bind_") of nkMixinStmt: result = lcomma(g, n) + len("mixin_") of nkCheckedFieldExpr: result = lsub(g, n.sons[0]) of nkLambda: result = lsons(g, n) + len("proc__=_") of nkDo: result = lsons(g, n) + len("do__:_") of nkConstDef, nkIdentDefs: result = lcomma(g, n, 0, - 3) var L = sonsLen(n) if n.sons[L - 2].kind != nkEmpty: result = result + lsub(g, n.sons[L - 2]) + 2 if n.sons[L - 1].kind != nkEmpty: result = result + lsub(g, n.sons[L - 1]) + 3 of nkVarTuple: result = lcomma(g, n, 0, - 3) + len("() = ") + lsub(g, lastSon(n)) of nkChckRangeF: result = len("chckRangeF") + 2 + lcomma(g, n) of nkChckRange64: result = len("chckRange64") + 2 + lcomma(g, n) of nkChckRange: result = len("chckRange") + 2 + lcomma(g, n) of nkObjDownConv, nkObjUpConv, nkStringToCString, nkCStringToString: result = 2 if sonsLen(n) >= 1: result = result + lsub(g, n.sons[0]) result = result + lcomma(g, n, 1) of nkExprColonExpr: result = lsons(g, n) + 2 of nkInfix: result = lsons(g, n) + 2 of nkPrefix: result = lsons(g, n)+1+(if n.len > 0 and n.sons[1].kind == nkInfix: 2 else: 0) of nkPostfix: result = lsons(g, n) of nkCallStrLit: result = lsons(g, n) of nkPragmaExpr: result = lsub(g, n.sons[0]) + lcomma(g, n, 1) of nkRange: result = lsons(g, n) + 2 of nkDerefExpr: result = lsub(g, n.sons[0]) + 2 of nkAccQuoted: result = lsons(g, n) + 2 of nkIfExpr: result = lsub(g, n.sons[0].sons[0]) + lsub(g, n.sons[0].sons[1]) + lsons(g, n, 1) + len("if_:_") of nkElifExpr: result = lsons(g, n) + len("_elif_:_") of nkElseExpr: result = lsub(g, n.sons[0]) + len("_else:_") # type descriptions of nkTypeOfExpr: result = (if n.len > 0: lsub(g, n.sons[0]) else: 0)+len("type()") of nkRefTy: result = (if n.len > 0: lsub(g, n.sons[0])+1 else: 0) + len("ref") of nkPtrTy: result = (if n.len > 0: lsub(g, n.sons[0])+1 else: 0) + len("ptr") of nkVarTy: result = (if n.len > 0: lsub(g, n.sons[0])+1 else: 0) + len("var") of nkDistinctTy: result = len("distinct") + (if n.len > 0: lsub(g, n.sons[0])+1 else: 0) if n.len > 1: result += (if n[1].kind == nkWith: len("_with_") else: len("_without_")) result += lcomma(g, n[1]) of nkStaticTy: result = (if n.len > 0: lsub(g, n.sons[0]) else: 0) + len("static[]") of nkTypeDef: result = lsons(g, n) + 3 of nkOfInherit: result = lsub(g, n.sons[0]) + len("of_") of nkProcTy: result = lsons(g, n) + len("proc_") of nkIteratorTy: result = lsons(g, n) + len("iterator_") of nkSharedTy: result = lsons(g, n) + len("shared_") of nkEnumTy: if sonsLen(n) > 0: result = lsub(g, n.sons[0]) + lcomma(g, n, 1) + len("enum_") else: result = len("enum") of nkEnumFieldDef: result = lsons(g, n) + 3 of nkVarSection, nkLetSection: if sonsLen(n) > 1: result = MaxLineLen + 1 else: result = lsons(g, n) + len("var_") of nkUsingStmt: if sonsLen(n) > 1: result = MaxLineLen + 1 else: result = lsons(g, n) + len("using_") of nkReturnStmt: result = lsub(g, n.sons[0]) + len("return_") of nkRaiseStmt: result = lsub(g, n.sons[0]) + len("raise_") of nkYieldStmt: result = lsub(g, n.sons[0]) + len("yield_") of nkDiscardStmt: result = lsub(g, n.sons[0]) + len("discard_") of nkBreakStmt: result = lsub(g, n.sons[0]) + len("break_") of nkContinueStmt: result = lsub(g, n.sons[0]) + len("continue_") of nkPragma: result = lcomma(g, n) + 4 of nkCommentStmt: result = if n.comment.isNil: 0 else: len(n.comment) of nkOfBranch: result = lcomma(g, n, 0, - 2) + lsub(g, lastSon(n)) + len("of_:_") of nkImportAs: result = lsub(g, n.sons[0]) + len("_as_") + lsub(g, n.sons[1]) of nkElifBranch: result = lsons(g, n) + len("elif_:_") of nkElse: result = lsub(g, n.sons[0]) + len("else:_") of nkFinally: result = lsub(g, n.sons[0]) + len("finally:_") of nkGenericParams: result = lcomma(g, n) + 2 of nkFormalParams: result = lcomma(g, n, 1) + 2 if n.sons[0].kind != nkEmpty: result = result + lsub(g, n.sons[0]) + 2 of nkExceptBranch: result = lcomma(g, n, 0, -2) + lsub(g, lastSon(n)) + len("except_:_") else: result = MaxLineLen + 1 proc fits(g: TSrcGen, x: int): bool = result = x + g.lineLen <= MaxLineLen type TSubFlag = enum rfLongMode, rfInConstExpr TSubFlags = set[TSubFlag] TContext = tuple[spacing: int, flags: TSubFlags] const emptyContext: TContext = (spacing: 0, flags: {}) proc initContext(c: var TContext) = c.spacing = 0 c.flags = {} proc gsub(g: var TSrcGen, n: PNode, c: TContext) proc gsub(g: var TSrcGen, n: PNode) = var c: TContext initContext(c) gsub(g, n, c) proc hasCom(n: PNode): bool = result = false if n.isNil: return false if n.comment != nil: return true case n.kind of nkEmpty..nkNilLit: discard else: for i in countup(0, sonsLen(n) - 1): if hasCom(n.sons[i]): return true proc putWithSpace(g: var TSrcGen, kind: TTokType, s: string) = put(g, kind, s) put(g, tkSpaces, Space) proc gcommaAux(g: var TSrcGen, n: PNode, ind: int, start: int = 0, theEnd: int = - 1, separator = tkComma) = for i in countup(start, sonsLen(n) + theEnd): var c = i < sonsLen(n) + theEnd var sublen = lsub(g, n.sons[i]) + ord(c) if not fits(g, sublen) and (ind + sublen < MaxLineLen): optNL(g, ind) let oldLen = g.tokens.len gsub(g, n.sons[i]) if c: if g.tokens.len > oldLen: putWithSpace(g, separator, TokTypeToStr[separator]) if hasCom(n.sons[i]): gcoms(g) optNL(g, ind) proc gcomma(g: var TSrcGen, n: PNode, c: TContext, start: int = 0, theEnd: int = - 1) = var ind: int if rfInConstExpr in c.flags: ind = g.indent + IndentWidth else: ind = g.lineLen if ind > MaxLineLen div 2: ind = g.indent + longIndentWid gcommaAux(g, n, ind, start, theEnd) proc gcomma(g: var TSrcGen, n: PNode, start: int = 0, theEnd: int = - 1) = var ind = g.lineLen if ind > MaxLineLen div 2: ind = g.indent + longIndentWid gcommaAux(g, n, ind, start, theEnd) proc gsemicolon(g: var TSrcGen, n: PNode, start: int = 0, theEnd: int = - 1) = var ind = g.lineLen if ind > MaxLineLen div 2: ind = g.indent + longIndentWid gcommaAux(g, n, ind, start, theEnd, tkSemiColon) proc gsons(g: var TSrcGen, n: PNode, c: TContext, start: int = 0, theEnd: int = - 1) = for i in countup(start, sonsLen(n) + theEnd): gsub(g, n.sons[i], c) proc gsection(g: var TSrcGen, n: PNode, c: TContext, kind: TTokType, k: string) = if sonsLen(n) == 0: return # empty var sections are possible putWithSpace(g, kind, k) gcoms(g) indentNL(g) for i in countup(0, sonsLen(n) - 1): optNL(g) gsub(g, n.sons[i], c) gcoms(g) dedent(g) proc longMode(g: TSrcGen; n: PNode, start: int = 0, theEnd: int = - 1): bool = result = n.comment != nil if not result: # check further for i in countup(start, sonsLen(n) + theEnd): if (lsub(g, n.sons[i]) > MaxLineLen): result = true break proc gstmts(g: var TSrcGen, n: PNode, c: TContext, doIndent=true) = if n.kind == nkEmpty: return if n.kind in {nkStmtList, nkStmtListExpr, nkStmtListType}: if doIndent: indentNL(g) let L = n.len for i in 0 .. L-1: if i > 0: optNL(g, n[i-1], n[i]) else: optNL(g) if n[i].kind in {nkStmtList, nkStmtListExpr, nkStmtListType}: gstmts(g, n[i], c, doIndent=false) else: gsub(g, n[i]) gcoms(g) if doIndent: dedent(g) else: if rfLongMode in c.flags: indentNL(g) gsub(g, n) gcoms(g) optNL(g) if rfLongMode in c.flags: dedent(g) proc gif(g: var TSrcGen, n: PNode) = var c: TContext gsub(g, n.sons[0].sons[0]) initContext(c) putWithSpace(g, tkColon, ":") if longMode(g, n) or (lsub(g, n.sons[0].sons[1]) + g.lineLen > MaxLineLen): incl(c.flags, rfLongMode) gcoms(g) # a good place for comments gstmts(g, n.sons[0].sons[1], c) var length = sonsLen(n) for i in countup(1, length - 1): optNL(g) gsub(g, n.sons[i], c) proc gwhile(g: var TSrcGen, n: PNode) = var c: TContext putWithSpace(g, tkWhile, "while") gsub(g, n.sons[0]) putWithSpace(g, tkColon, ":") initContext(c) if longMode(g, n) or (lsub(g, n.sons[1]) + g.lineLen > MaxLineLen): incl(c.flags, rfLongMode) gcoms(g) # a good place for comments gstmts(g, n.sons[1], c) proc gpattern(g: var TSrcGen, n: PNode) = var c: TContext put(g, tkCurlyLe, "{") initContext(c) if longMode(g, n) or (lsub(g, n.sons[0]) + g.lineLen > MaxLineLen): incl(c.flags, rfLongMode) gcoms(g) # a good place for comments gstmts(g, n, c) put(g, tkCurlyRi, "}") proc gpragmaBlock(g: var TSrcGen, n: PNode) = var c: TContext gsub(g, n.sons[0]) putWithSpace(g, tkColon, ":") initContext(c) if longMode(g, n) or (lsub(g, n.sons[1]) + g.lineLen > MaxLineLen): incl(c.flags, rfLongMode) gcoms(g) # a good place for comments gstmts(g, n.sons[1], c) proc gtry(g: var TSrcGen, n: PNode) = var c: TContext put(g, tkTry, "try") putWithSpace(g, tkColon, ":") initContext(c) if longMode(g, n) or (lsub(g, n.sons[0]) + g.lineLen > MaxLineLen): incl(c.flags, rfLongMode) gcoms(g) # a good place for comments gstmts(g, n.sons[0], c) gsons(g, n, c, 1) proc gfor(g: var TSrcGen, n: PNode) = var c: TContext var length = sonsLen(n) putWithSpace(g, tkFor, "for") initContext(c) if longMode(g, n) or (lsub(g, n.sons[length - 1]) + lsub(g, n.sons[length - 2]) + 6 + g.lineLen > MaxLineLen): incl(c.flags, rfLongMode) gcomma(g, n, c, 0, - 3) put(g, tkSpaces, Space) putWithSpace(g, tkIn, "in") gsub(g, n.sons[length - 2], c) putWithSpace(g, tkColon, ":") gcoms(g) gstmts(g, n.sons[length - 1], c) proc gcase(g: var TSrcGen, n: PNode) = var c: TContext initContext(c) var length = sonsLen(n) if length == 0: return var last = if n.sons[length-1].kind == nkElse: -2 else: -1 if longMode(g, n, 0, last): incl(c.flags, rfLongMode) putWithSpace(g, tkCase, "case") gsub(g, n.sons[0]) gcoms(g) optNL(g) gsons(g, n, c, 1, last) if last == - 2: initContext(c) if longMode(g, n.sons[length - 1]): incl(c.flags, rfLongMode) gsub(g, n.sons[length - 1], c) proc gproc(g: var TSrcGen, n: PNode) = var c: TContext if n.sons[namePos].kind == nkSym: let s = n.sons[namePos].sym put(g, tkSymbol, renderDefinitionName(s)) if sfGenSym in s.flags: put(g, tkIntLit, $s.id) else: gsub(g, n.sons[namePos]) if n.sons[patternPos].kind != nkEmpty: gpattern(g, n.sons[patternPos]) let oldInGenericParams = g.inGenericParams g.inGenericParams = true if renderNoBody in g.flags and n[miscPos].kind != nkEmpty and n[miscPos][1].kind != nkEmpty: gsub(g, n[miscPos][1]) else: gsub(g, n.sons[genericParamsPos]) g.inGenericParams = oldInGenericParams gsub(g, n.sons[paramsPos]) gsub(g, n.sons[pragmasPos]) if renderNoBody notin g.flags: if n.sons[bodyPos].kind != nkEmpty: put(g, tkSpaces, Space) putWithSpace(g, tkEquals, "=") indentNL(g) gcoms(g) dedent(g) initContext(c) gstmts(g, n.sons[bodyPos], c) putNL(g) else: indentNL(g) gcoms(g) dedent(g) proc gTypeClassTy(g: var TSrcGen, n: PNode) = var c: TContext initContext(c) putWithSpace(g, tkConcept, "concept") gsons(g, n[0], c) # arglist gsub(g, n[1]) # pragmas gsub(g, n[2]) # of gcoms(g) indentNL(g) gcoms(g) gstmts(g, n[3], c) dedent(g) proc gblock(g: var TSrcGen, n: PNode) = var c: TContext initContext(c) if n.sons[0].kind != nkEmpty: putWithSpace(g, tkBlock, "block") gsub(g, n.sons[0]) else: put(g, tkBlock, "block") putWithSpace(g, tkColon, ":") if longMode(g, n) or (lsub(g, n.sons[1]) + g.lineLen > MaxLineLen): incl(c.flags, rfLongMode) gcoms(g) # XXX I don't get why this is needed here! gstmts should already handle this! indentNL(g) gstmts(g, n.sons[1], c) dedent(g) proc gstaticStmt(g: var TSrcGen, n: PNode) = var c: TContext putWithSpace(g, tkStatic, "static") putWithSpace(g, tkColon, ":") initContext(c) if longMode(g, n) or (lsub(g, n.sons[0]) + g.lineLen > MaxLineLen): incl(c.flags, rfLongMode) gcoms(g) # a good place for comments gstmts(g, n.sons[0], c) proc gasm(g: var TSrcGen, n: PNode) = putWithSpace(g, tkAsm, "asm") gsub(g, n.sons[0]) gcoms(g) if n.sons.len > 1: gsub(g, n.sons[1]) proc gident(g: var TSrcGen, n: PNode) = if g.inGenericParams and n.kind == nkSym: if sfAnon in n.sym.flags or (n.typ != nil and tfImplicitTypeParam in n.typ.flags): return var t: TTokType var s = atom(g, n) if (s[0] in lexer.SymChars): if (n.kind == nkIdent): if (n.ident.id < ord(tokKeywordLow) - ord(tkSymbol)) or (n.ident.id > ord(tokKeywordHigh) - ord(tkSymbol)): t = tkSymbol else: t = TTokType(n.ident.id + ord(tkSymbol)) else: t = tkSymbol else: t = tkOpr put(g, t, s) if n.kind == nkSym and (renderIds in g.flags or sfGenSym in n.sym.flags): when defined(debugMagics): put(g, tkIntLit, $n.sym.id & $n.sym.magic) else: put(g, tkIntLit, $n.sym.id) proc doParamsAux(g: var TSrcGen, params: PNode) = if params.len > 1: put(g, tkParLe, "(") gsemicolon(g, params, 1) put(g, tkParRi, ")") if params.len > 0 and params.sons[0].kind != nkEmpty: putWithSpace(g, tkOpr, "->") gsub(g, params.sons[0]) proc gsub(g: var TSrcGen; n: PNode; i: int) = if i < n.len: gsub(g, n[i]) else: put(g, tkOpr, "<<" & $i & "th child missing for " & $n.kind & " >>") proc isBracket*(n: PNode): bool = case n.kind of nkClosedSymChoice, nkOpenSymChoice: if n.len > 0: result = isBracket(n[0]) of nkSym: result = n.sym.name.s == "[]" else: result = false proc gsub(g: var TSrcGen, n: PNode, c: TContext) = if isNil(n): return var a: TContext if n.comment != nil: pushCom(g, n) case n.kind # atoms: of nkTripleStrLit: put(g, tkTripleStrLit, atom(g, n)) of nkEmpty: discard of nkType: put(g, tkInvalid, atom(g, n)) of nkSym, nkIdent: gident(g, n) of nkIntLit: put(g, tkIntLit, atom(g, n)) of nkInt8Lit: put(g, tkInt8Lit, atom(g, n)) of nkInt16Lit: put(g, tkInt16Lit, atom(g, n)) of nkInt32Lit: put(g, tkInt32Lit, atom(g, n)) of nkInt64Lit: put(g, tkInt64Lit, atom(g, n)) of nkUIntLit: put(g, tkUIntLit, atom(g, n)) of nkUInt8Lit: put(g, tkUInt8Lit, atom(g, n)) of nkUInt16Lit: put(g, tkUInt16Lit, atom(g, n)) of nkUInt32Lit: put(g, tkUInt32Lit, atom(g, n)) of nkUInt64Lit: put(g, tkUInt64Lit, atom(g, n)) of nkFloatLit: put(g, tkFloatLit, atom(g, n)) of nkFloat32Lit: put(g, tkFloat32Lit, atom(g, n)) of nkFloat64Lit: put(g, tkFloat64Lit, atom(g, n)) of nkFloat128Lit: put(g, tkFloat128Lit, atom(g, n)) of nkStrLit: put(g, tkStrLit, atom(g, n)) of nkRStrLit: put(g, tkRStrLit, atom(g, n)) of nkCharLit: put(g, tkCharLit, atom(g, n)) of nkNilLit: put(g, tkNil, atom(g, n)) # complex expressions of nkCall, nkConv, nkDotCall, nkPattern, nkObjConstr: if n.len > 0 and isBracket(n[0]): gsub(g, n, 1) put(g, tkBracketLe, "[") gcomma(g, n, 2) put(g, tkBracketRi, "]") elif n.len > 1 and n.lastSon.kind == nkStmtList: gsub(g, n[0]) if n.len > 2: put(g, tkParLe, "(") gcomma(g, n, 1, -2) put(g, tkParRi, ")") put(g, tkColon, ":") gsub(g, n, n.len-1) else: if sonsLen(n) >= 1: gsub(g, n.sons[0]) put(g, tkParLe, "(") gcomma(g, n, 1) put(g, tkParRi, ")") of nkCallStrLit: gsub(g, n, 0) if n.len > 1 and n.sons[1].kind == nkRStrLit: put(g, tkRStrLit, '\"' & replace(n[1].strVal, "\"", "\"\"") & '\"') else: gsub(g, n.sons[1]) of nkHiddenStdConv, nkHiddenSubConv, nkHiddenCallConv: if n.len >= 2: gsub(g, n.sons[1]) else: put(g, tkSymbol, "(wrong conv)") of nkCast: put(g, tkCast, "cast") put(g, tkBracketLe, "[") gsub(g, n, 0) put(g, tkBracketRi, "]") put(g, tkParLe, "(") gsub(g, n, 1) put(g, tkParRi, ")") of nkAddr: put(g, tkAddr, "addr") if n.len > 0: put(g, tkParLe, "(") gsub(g, n.sons[0]) put(g, tkParRi, ")") of nkStaticExpr: put(g, tkStatic, "static") put(g, tkSpaces, Space) gsub(g, n, 0) of nkBracketExpr: gsub(g, n, 0) put(g, tkBracketLe, "[") gcomma(g, n, 1) put(g, tkBracketRi, "]") of nkCurlyExpr: gsub(g, n, 0) put(g, tkCurlyLe, "{") gcomma(g, n, 1) put(g, tkCurlyRi, "}") of nkPragmaExpr: gsub(g, n, 0) gcomma(g, n, 1) of nkCommand: gsub(g, n, 0) put(g, tkSpaces, Space) gcomma(g, n, 1) of nkExprEqExpr, nkAsgn, nkFastAsgn: gsub(g, n, 0) put(g, tkSpaces, Space) putWithSpace(g, tkEquals, "=") gsub(g, n, 1) of nkChckRangeF: put(g, tkSymbol, "chckRangeF") put(g, tkParLe, "(") gcomma(g, n) put(g, tkParRi, ")") of nkChckRange64: put(g, tkSymbol, "chckRange64") put(g, tkParLe, "(") gcomma(g, n) put(g, tkParRi, ")") of nkChckRange: put(g, tkSymbol, "chckRange") put(g, tkParLe, "(") gcomma(g, n) put(g, tkParRi, ")") of nkObjDownConv, nkObjUpConv, nkStringToCString, nkCStringToString: if sonsLen(n) >= 1: gsub(g, n.sons[0]) put(g, tkParLe, "(") gcomma(g, n, 1) put(g, tkParRi, ")") of nkClosedSymChoice, nkOpenSymChoice: if renderIds in g.flags: put(g, tkParLe, "(") for i in countup(0, sonsLen(n) - 1): if i > 0: put(g, tkOpr, "|") if n.sons[i].kind == nkSym: let s = n[i].sym if s.owner != nil: put g, tkSymbol, n[i].sym.owner.name.s put g, tkOpr, "." put g, tkSymbol, n[i].sym.name.s else: gsub(g, n.sons[i], c) put(g, tkParRi, if n.kind == nkOpenSymChoice: "|...)" else: ")") else: gsub(g, n, 0) of nkPar, nkClosure: put(g, tkParLe, "(") gcomma(g, n, c) put(g, tkParRi, ")") of nkTupleConstr: put(g, tkParLe, "(") gcomma(g, n, c) if n.len == 1: put(g, tkComma, ",") put(g, tkParRi, ")") of nkCurly: put(g, tkCurlyLe, "{") gcomma(g, n, c) put(g, tkCurlyRi, "}") of nkArgList: gcomma(g, n, c) of nkTableConstr: put(g, tkCurlyLe, "{") if n.len > 0: gcomma(g, n, c) else: put(g, tkColon, ":") put(g, tkCurlyRi, "}") of nkBracket: put(g, tkBracketLe, "[") gcomma(g, n, c) put(g, tkBracketRi, "]") of nkDotExpr: gsub(g, n, 0) put(g, tkDot, ".") gsub(g, n, 1) of nkBind: putWithSpace(g, tkBind, "bind") gsub(g, n, 0) of nkCheckedFieldExpr, nkHiddenAddr, nkHiddenDeref: gsub(g, n, 0) of nkLambda: putWithSpace(g, tkProc, "proc") gsub(g, n, paramsPos) gsub(g, n, pragmasPos) put(g, tkSpaces, Space) putWithSpace(g, tkEquals, "=") gsub(g, n, bodyPos) of nkDo: putWithSpace(g, tkDo, "do") if paramsPos < n.len: doParamsAux(g, n.sons[paramsPos]) gsub(g, n, pragmasPos) put(g, tkColon, ":") gsub(g, n, bodyPos) of nkConstDef, nkIdentDefs: gcomma(g, n, 0, -3) var L = sonsLen(n) if L >= 2 and n.sons[L - 2].kind != nkEmpty: putWithSpace(g, tkColon, ":") gsub(g, n, L - 2) if L >= 1 and n.sons[L - 1].kind != nkEmpty: put(g, tkSpaces, Space) putWithSpace(g, tkEquals, "=") gsub(g, n.sons[L - 1], c) of nkVarTuple: put(g, tkParLe, "(") gcomma(g, n, 0, -3) put(g, tkParRi, ")") put(g, tkSpaces, Space) putWithSpace(g, tkEquals, "=") gsub(g, lastSon(n), c) of nkExprColonExpr: gsub(g, n, 0) putWithSpace(g, tkColon, ":") gsub(g, n, 1) of nkInfix: gsub(g, n, 1) put(g, tkSpaces, Space) gsub(g, n, 0) # binary operator if not fits(g, lsub(g, n.sons[2]) + lsub(g, n.sons[0]) + 1): optNL(g, g.indent + longIndentWid) else: put(g, tkSpaces, Space) gsub(g, n, 2) of nkPrefix: gsub(g, n, 0) if n.len > 1: let opr = if n[0].kind == nkIdent: n[0].ident elif n[0].kind == nkSym: n[0].sym.name elif n[0].kind in {nkOpenSymChoice, nkClosedSymChoice}: n[0][0].sym.name else: nil if n[1].kind == nkPrefix or (opr != nil and renderer.isKeyword(opr)): put(g, tkSpaces, Space) if n.sons[1].kind == nkInfix: put(g, tkParLe, "(") gsub(g, n.sons[1]) put(g, tkParRi, ")") else: gsub(g, n.sons[1]) of nkPostfix: gsub(g, n, 1) gsub(g, n, 0) of nkRange: gsub(g, n, 0) put(g, tkDotDot, "..") gsub(g, n, 1) of nkDerefExpr: gsub(g, n, 0) put(g, tkOpr, "[]") of nkAccQuoted: put(g, tkAccent, "`") if n.len > 0: gsub(g, n.sons[0]) for i in 1 ..< n.len: put(g, tkSpaces, Space) gsub(g, n.sons[i]) put(g, tkAccent, "`") of nkIfExpr: putWithSpace(g, tkIf, "if") if n.len > 0: gsub(g, n.sons[0], 0) putWithSpace(g, tkColon, ":") if n.len > 0: gsub(g, n.sons[0], 1) gsons(g, n, emptyContext, 1) of nkElifExpr: putWithSpace(g, tkElif, " elif") gsub(g, n, 0) putWithSpace(g, tkColon, ":") gsub(g, n, 1) of nkElseExpr: put(g, tkElse, " else") putWithSpace(g, tkColon, ":") gsub(g, n, 0) of nkTypeOfExpr: put(g, tkType, "type") put(g, tkParLe, "(") if n.len > 0: gsub(g, n.sons[0]) put(g, tkParRi, ")") of nkRefTy: if sonsLen(n) > 0: putWithSpace(g, tkRef, "ref") gsub(g, n.sons[0]) else: put(g, tkRef, "ref") of nkPtrTy: if sonsLen(n) > 0: putWithSpace(g, tkPtr, "ptr") gsub(g, n.sons[0]) else: put(g, tkPtr, "ptr") of nkVarTy: if sonsLen(n) > 0: putWithSpace(g, tkVar, "var") gsub(g, n.sons[0]) else: put(g, tkVar, "var") of nkDistinctTy: if n.len > 0: putWithSpace(g, tkDistinct, "distinct") gsub(g, n.sons[0]) if n.len > 1: if n[1].kind == nkWith: putWithSpace(g, tkSymbol, " with") else: putWithSpace(g, tkSymbol, " without") gcomma(g, n[1]) else: put(g, tkDistinct, "distinct") of nkTypeDef: gsub(g, n, 0) gsub(g, n, 1) put(g, tkSpaces, Space) if n.len > 2 and n.sons[2].kind != nkEmpty: putWithSpace(g, tkEquals, "=") gsub(g, n.sons[2]) of nkObjectTy: if sonsLen(n) > 0: putWithSpace(g, tkObject, "object") gsub(g, n.sons[0]) gsub(g, n.sons[1]) gcoms(g) gsub(g, n.sons[2]) else: put(g, tkObject, "object") of nkRecList: indentNL(g) for i in countup(0, sonsLen(n) - 1): optNL(g) gsub(g, n.sons[i], c) gcoms(g) dedent(g) putNL(g) of nkOfInherit: putWithSpace(g, tkOf, "of") gsub(g, n, 0) of nkProcTy: if sonsLen(n) > 0: putWithSpace(g, tkProc, "proc") gsub(g, n, 0) gsub(g, n, 1) else: put(g, tkProc, "proc") of nkIteratorTy: if sonsLen(n) > 0: putWithSpace(g, tkIterator, "iterator") gsub(g, n, 0) gsub(g, n, 1) else: put(g, tkIterator, "iterator") of nkStaticTy: put(g, tkStatic, "static") put(g, tkBracketLe, "[") if n.len > 0: gsub(g, n.sons[0]) put(g, tkBracketRi, "]") of nkEnumTy: if sonsLen(n) > 0: putWithSpace(g, tkEnum, "enum") gsub(g, n.sons[0]) gcoms(g) indentNL(g) gcommaAux(g, n, g.indent, 1) gcoms(g) # BUGFIX: comment for the last enum field dedent(g) else: put(g, tkEnum, "enum") of nkEnumFieldDef: gsub(g, n, 0) put(g, tkSpaces, Space) putWithSpace(g, tkEquals, "=") gsub(g, n, 1) of nkStmtList, nkStmtListExpr, nkStmtListType: gstmts(g, n, emptyContext) of nkIfStmt: putWithSpace(g, tkIf, "if") gif(g, n) of nkWhen, nkRecWhen: putWithSpace(g, tkWhen, "when") gif(g, n) of nkWhileStmt: gwhile(g, n) of nkPragmaBlock: gpragmaBlock(g, n) of nkCaseStmt, nkRecCase: gcase(g, n) of nkTryStmt: gtry(g, n) of nkForStmt, nkParForStmt: gfor(g, n) of nkBlockStmt, nkBlockExpr: gblock(g, n) of nkStaticStmt: gstaticStmt(g, n) of nkAsmStmt: gasm(g, n) of nkProcDef: if renderNoProcDefs notin g.flags: putWithSpace(g, tkProc, "proc") gproc(g, n) of nkFuncDef: if renderNoProcDefs notin g.flags: putWithSpace(g, tkFunc, "func") gproc(g, n) of nkConverterDef: if renderNoProcDefs notin g.flags: putWithSpace(g, tkConverter, "converter") gproc(g, n) of nkMethodDef: if renderNoProcDefs notin g.flags: putWithSpace(g, tkMethod, "method") gproc(g, n) of nkIteratorDef: if renderNoProcDefs notin g.flags: putWithSpace(g, tkIterator, "iterator") gproc(g, n) of nkMacroDef: if renderNoProcDefs notin g.flags: putWithSpace(g, tkMacro, "macro") gproc(g, n) of nkTemplateDef: if renderNoProcDefs notin g.flags: putWithSpace(g, tkTemplate, "template") gproc(g, n) of nkTypeSection: gsection(g, n, emptyContext, tkType, "type") of nkConstSection: initContext(a) incl(a.flags, rfInConstExpr) gsection(g, n, a, tkConst, "const") of nkVarSection, nkLetSection, nkUsingStmt: var L = sonsLen(n) if L == 0: return if n.kind == nkVarSection: putWithSpace(g, tkVar, "var") elif n.kind == nkLetSection: putWithSpace(g, tkLet, "let") else: putWithSpace(g, tkUsing, "using") if L > 1: gcoms(g) indentNL(g) for i in countup(0, L - 1): optNL(g) gsub(g, n.sons[i]) gcoms(g) dedent(g) else: gsub(g, n.sons[0]) of nkReturnStmt: putWithSpace(g, tkReturn, "return") gsub(g, n, 0) of nkRaiseStmt: putWithSpace(g, tkRaise, "raise") gsub(g, n, 0) of nkYieldStmt: putWithSpace(g, tkYield, "yield") gsub(g, n, 0) of nkDiscardStmt: putWithSpace(g, tkDiscard, "discard") gsub(g, n, 0) of nkBreakStmt: putWithSpace(g, tkBreak, "break") gsub(g, n, 0) of nkContinueStmt: putWithSpace(g, tkContinue, "continue") gsub(g, n, 0) of nkPragma: if renderNoPragmas notin g.flags: if g.inPragma <= 0: inc g.inPragma #if not previousNL(g): put(g, tkSpaces, Space) put(g, tkCurlyDotLe, "{.") gcomma(g, n, emptyContext) put(g, tkCurlyDotRi, ".}") dec g.inPragma else: gcomma(g, n, emptyContext) of nkImportStmt, nkExportStmt: if n.kind == nkImportStmt: putWithSpace(g, tkImport, "import") else: putWithSpace(g, tkExport, "export") gcoms(g) indentNL(g) gcommaAux(g, n, g.indent) dedent(g) putNL(g) of nkImportExceptStmt, nkExportExceptStmt: if n.kind == nkImportExceptStmt: putWithSpace(g, tkImport, "import") else: putWithSpace(g, tkExport, "export") gsub(g, n, 0) put(g, tkSpaces, Space) putWithSpace(g, tkExcept, "except") gcommaAux(g, n, g.indent, 1) gcoms(g) putNL(g) of nkFromStmt: putWithSpace(g, tkFrom, "from") gsub(g, n, 0) put(g, tkSpaces, Space) putWithSpace(g, tkImport, "import") gcomma(g, n, emptyContext, 1) putNL(g) of nkIncludeStmt: putWithSpace(g, tkInclude, "include") gcoms(g) indentNL(g) gcommaAux(g, n, g.indent) dedent(g) putNL(g) of nkCommentStmt: gcoms(g) optNL(g) of nkOfBranch: optNL(g) putWithSpace(g, tkOf, "of") gcomma(g, n, c, 0, - 2) putWithSpace(g, tkColon, ":") gcoms(g) gstmts(g, lastSon(n), c) of nkImportAs: gsub(g, n, 0) put(g, tkSpaces, Space) putWithSpace(g, tkAs, "as") gsub(g, n, 1) of nkBindStmt: putWithSpace(g, tkBind, "bind") gcomma(g, n, c) of nkMixinStmt: putWithSpace(g, tkMixin, "mixin") gcomma(g, n, c) of nkElifBranch: optNL(g) putWithSpace(g, tkElif, "elif") gsub(g, n, 0) putWithSpace(g, tkColon, ":") gcoms(g) gstmts(g, n.sons[1], c) of nkElse: optNL(g) put(g, tkElse, "else") putWithSpace(g, tkColon, ":") gcoms(g) gstmts(g, n.sons[0], c) of nkFinally, nkDefer: optNL(g) if n.kind == nkFinally: put(g, tkFinally, "finally") else: put(g, tkDefer, "defer") putWithSpace(g, tkColon, ":") gcoms(g) gstmts(g, n.sons[0], c) of nkExceptBranch: optNL(g) if n.len != 1: putWithSpace(g, tkExcept, "except") else: put(g, tkExcept, "except") gcomma(g, n, 0, -2) putWithSpace(g, tkColon, ":") gcoms(g) gstmts(g, lastSon(n), c) of nkGenericParams: proc hasExplicitParams(gp: PNode): bool = for p in gp: if p.typ == nil or tfImplicitTypeParam notin p.typ.flags: return true return false if n.hasExplicitParams: put(g, tkBracketLe, "[") gsemicolon(g, n) put(g, tkBracketRi, "]") of nkFormalParams: put(g, tkParLe, "(") gsemicolon(g, n, 1) put(g, tkParRi, ")") if n.len > 0 and n.sons[0].kind != nkEmpty: putWithSpace(g, tkColon, ":") gsub(g, n.sons[0]) of nkTupleTy: put(g, tkTuple, "tuple") put(g, tkBracketLe, "[") gcomma(g, n) put(g, tkBracketRi, "]") of nkTupleClassTy: put(g, tkTuple, "tuple") of nkComesFrom: put(g, tkParLe, "(ComesFrom|") gsub(g, n, 0) put(g, tkParRi, ")") of nkGotoState, nkState: var c: TContext initContext c putWithSpace g, tkSymbol, if n.kind == nkState: "state" else: "goto" gsons(g, n, c) of nkBreakState: put(g, tkTuple, "breakstate") of nkTypeClassTy: gTypeClassTy(g, n) else: #nkNone, nkExplicitTypeListCall: internalError(n.info, "rnimsyn.gsub(" & $n.kind & ')') proc renderTree*(n: PNode, renderFlags: TRenderFlags = {}): string = var g: TSrcGen initSrcGen(g, renderFlags) # do not indent the initial statement list so that # writeFile("file.nim", repr n) # produces working Nim code: if n.kind in {nkStmtList, nkStmtListExpr, nkStmtListType}: gstmts(g, n, emptyContext, doIndent = false) else: gsub(g, n) result = g.buf proc `$`*(n: PNode): string = n.renderTree proc renderModule*(n: PNode, infile, outfile: string, renderFlags: TRenderFlags = {}; fid = FileIndex(-1)) = var f: File g: TSrcGen initSrcGen(g, renderFlags) g.fid = fid for i in countup(0, sonsLen(n) - 1): gsub(g, n.sons[i]) optNL(g) case n.sons[i].kind of nkTypeSection, nkConstSection, nkVarSection, nkLetSection, nkCommentStmt: putNL(g) else: discard gcoms(g) if optStdout in gGlobalOptions: write(stdout, g.buf) elif open(f, outfile, fmWrite): write(f, g.buf) close(f) else: rawMessage(errCannotOpenFile, outfile) proc initTokRender*(r: var TSrcGen, n: PNode, renderFlags: TRenderFlags = {}) = initSrcGen(r, renderFlags) gsub(r, n) proc getNextTok*(r: var TSrcGen, kind: var TTokType, literal: var string) = if r.idx < len(r.tokens): kind = r.tokens[r.idx].kind var length = r.tokens[r.idx].length.int literal = substr(r.buf, r.pos, r.pos + length - 1) inc(r.pos, length) inc(r.idx) else: kind = tkEof id='n3555' href='#n3555'>3555 3556 3557 3558 3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722



                                                                                          
                                    










                                                                                                      
                                

                                                             
           

                                  


                                                                           
                             

                                                              
































                                                                                 
                                                                                                                                     






                                                                                                                                                    
                                                                                     
                                                                                                                                                                          
















                                                                                                                                                            
                                                                                                               






                                                                                                                                                      









                                                                                                                                                                                                                              
                                                                                                                                                                  
                                                                                             



                                                                                                                                                                                                                                                                                                                                                                                              

                                                                                                                                                                                                                                                                                                                                                                                                                  



                                                                                                                                                                                                                                                                                                                                                                                         
                                                                                                                    
                                                                                                
                                                                                                                                                                                                                                                                                                                                                                       
                                                                                           
                                                                                                                             


                                                                                                                                                                                                                                                                                                                                                                                         
                                                                                                                                                            
                                                                                                                   
                                                                                                                                                                                                                                                                                                                                                               
                                                                                                   
                                                                                                                                                       




                                                                                                                                                                                                                                                                                                                                                                                            
                                                                                                                                        

                                                                                                                                                                                                                                                                                                                                                                                         

                                                                                                                       
                                                                                               

                                                                                            
                                                                                                                  
                                                                                                                                                                                                                                                                                                                                                                                                 

                                                                                                      
                                                                                                            
                                                                                                           



                                                                                                                                                 
                                                                                                             









                                                                                                                                                                                                                                                                                                                                                                                         
                                                                                                  
                                                                      
                                                                                               



                                                                                              



                                                                                                                                                     

                                                                                                                                         
                                                                                                                                                                                       
                                                                                            
                                                                                                               
                                                                                                     
                                                                                                                        
                                                                                                                               




                                                                                                                          
                                                                                              





                                                                                                                                                                                                                                                                                                                                                                                               
                                                                                                                                                                   




                                                                                                                                                                                                                                                                                                                                                                                                 
                                                                                                                                    








                                                                                                                                                                                                                                                                                                                                                                                               
                                                                                                                       








                                                                                                                                                                                                                                                                                                                                                                                               


























































































                                                                                                                                                                                                                                                                                                                                                                                               
                                                                                                                             



                                                                                                                                                                                                                                                                                                                                                                                          
                                                                                                                                         
                                                                                                 
                                                                                                   










                                                                                                                                                                                                                                                                                                                                                                                          
                                                                                                                                          
                                                                                                 
                                                                                                    







                                                                                                                                                                                                                                                                                                                                                                                          
                                                                                                                             






                                                                                                                                                                                                                                                                                                                                                                                          
                                                                                                                             






                                                                                                                                                                                                                                                                                                                                                                                          
                                                                                                                             






                                                                                                                                                                                                                                                                                                                                                                                          
                                                                                                                             






                                                                                                                                                                                                                                                                                                                                                                                          
                                                                                                                             






                                                                                                                                                                                                                                                                                                                                                                                          
                                                                                                                             






                                                                                                                                                                                                                                                                                                                                                                                          
                                                                                                                                    










                                                                                                                                                                                                                                                                                                                                                                                          
                                                                                                                            






                                                                                                                                                                                                                                                                                                                                                                                          
                                                                                                                            






                                                                                                                                                                                                                                                                                                                                                                                          
                                                                                                                            






                                                                                                                                                                                                                                                                                                                                                                                          
                                                                                                                            






















                                                                                                                                                                                                                                                                                                                                                                                               
                                                                                                                                                                                                                                                       









                                                                                                       
                                                                                                                         






























                                                                                                                                                                                                
                                                                                                                                             














































                                                                                                                                                                                                                                                                                                                                                                                                                       
                                                                                                       

















                                                                                                                                                                                                                                                                                                                                                                                          

                                                                                                             
                                                                                                  



                                                                                                                                           
                                                                                                                          

                                                                                                                                                                                                                                                                                                                                                                                          

                                                                                                             
                                                                                                  




                                                                                                                                                   
                                                                                                                    

                                                                                                                                                                                                                                                                                                                                                                                          

                                                                                                                      
                                                                                                  

                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                          





                                                                                                                                                                                                                                                                                                                                                                                              
                                                                                                                     








































                                                                                                                                                                                                                                                                                                                                                                                                     
                                                                                                                        






                                                                                                                                                                                                                                                                                                                                                                                               
                                                                                             











                                                                                                                                                                                                                                                                                                                                                                                          

                                                                                                             
                                                                                              





                                                                                                                                                                                                                                                                                                                                                                                              
                                                                                                                     























                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                     










                                                                                                                                                                                                                                                                                                                                                                                                     
                                                                                                                       

                                                                                                                                                                                                                                                                                                                                                                                           

                                                                                                                       
                                                                                                 







                                                                                                                                                                                                                                                                                                                                                                                                   
                                                                                                                                  










































                                                                                                                                                                                                                                                                                                                                                                                                 
                                                                                                                                   














                                                                                                                                                                                                                                                                                                                                                                                               
                                                                                                                      















































                                                                                                                                                                                                                                                                                                                                                                                                      
                                                                                                               






























                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                              



                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                        




                                                                                                                                                                                                                                                                                                                                                                                                  
                                                                                                                      








                                                                                                                                                                                                                                                                                                                                                                                                  
                                                                                                                              






                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                              






                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                              






                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                              






                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                              






                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                              







                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                              
                                                                                             
                                                                                                                   
                                                                                                     







                                                                                                                                                                                                                                                                                                                                                                                          
                                                                                                                             






                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                             






                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                             






                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                             






                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                             






                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                             






                                                                                                                                                                                                                                                                                                                                                                                                                      
                                                                                             
                                                                                                                       
                                                                                                     





                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                                                                                                                                 
                                                                                              
                                                                                                                                   
                                                                                                                                     








                                                                                                                                                                                
                                                                                                                               
                                                                                                                                 

                                                                                                                

                                                                                                                                                
























                                                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                                       




                                                                                                                                                                                                                                                                                                                                                                                                     
                                                                                                            


































                                                                                                                                                                                                                                                                                                                                                                                                                      
                                                                                                                                   




                                                                                                                                                                                                                                                                                                                                                                                                     
                                                                                                      



                                                                                                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                        








                                                                                                                                                                                                                                                                                                                                                                                              
                                                                                                           



























































                                                                                                                                                                                                                                                                                                                                                                                                                      
                                                                                                                             




                                                                                                                                                                                                                                                                                                                                                                                                  
                                                                                                                            






































































                                                                                                                                                                                                                                                                                                                                                                                                  
                                                                                                                             






                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                             






                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                             






                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                             






                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                             






                                                                                                                                                                                                                                                                                                                                                                                                                      
                                                                                             
                                                                                                                       
                                                                                                     






















                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                             




                                                                                                                                                                                                                                                                                                                                                                                                  
                                                                                                                            

















































                                                                                                                                                                                                                                                                                                                                                                                                  
                                                                                                                             






                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                             






                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                             






                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                                                                                                                                                                                

































                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                                                                                                                                                                                  





































































                                                                                                                                                                                                                                                                                                                                                                                                  
                                                                                                             


                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                        
























                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                          






























                                                                                                                                                                                                                                                                                                                                                                                               
                                                                                                 








                                                                                                                                                                                                                                                                                                                                                                                                        
                                                                                                





                                                                                                                  
                                                                                                                       

                                                                                                                                                                                                                                                                                                                                                                                           

                                                                                                              
                                                                                                 






                                                                                                                                      
                                                                                                                     

                                                                                                                                                                                                                                                                                                                                                                                           

                                                                                                              
                                                                                                 






                                                                                                                                                                                                                                                                                                                                                                                                       
                                                                                                  




                                                                                                                                                                                                                                                                                                                                                                                               
                                                                                                                             



















                                                                                                                                                                                                                                                                                                                                                                                                                      
                                                                                             
                                                                                                                                   
                                                                                                     









                                                                                                                                                                                                                                                                                                                                                                                               
                                                                                                                  














                                                                                                                                                                                                                                                                                                                                                                                                                      

                                                                                                                               
                                                                                                                 









                                                                                                                                                                                                                                                                                                                                                                                           

                                                                                                              
                                                                                                             









                                                                                                                                                                                                                                                                                                                                                                                           

                                                                                                              
                                                                                                             





















                                                                                                                                                                                                                                                                                                                                                                                               

                                                                                                              
                                                                                                  









                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                        
                                                                           
                                                                                                             






















                                                                                                                                                                                                                                                                                                                                                                                               

                                                                                                                        
                                                                                                              























                                                                                                                                                                                                                                                                                                                                                                                                      

                                                                                                              
                                                                                            















                                                                                                                                                                                                                                                                                                                                                                                                      
                                                                                                  




























                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                               









                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                  

                                                                                                                                                              
                                                                                             
                                                                                                               

                                                                                                                                                                                                                                                                                                                                                                                           












                                                                                                                                              
                                                                                                               






                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                             











































                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                  
                                                                                                                              
                                                                                             
                                                                                                                     

                                                                                                                                                                                                                                                                                                                                                                                           






                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                                           
                                                                                                  
                                                                                                     



                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                             




                                                                                                                                                                                                                                                                                                                                                                                                  
                                                                                                                            








                                                                                                                                                                                                                                                                                                                                                                                                  
                                                                                                                              






                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                              






                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                              






                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                              






                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                              






                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                              






                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                              







































                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                              


















                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                                            







                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                                            







                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                                            







                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                                            
































                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                              






                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                             
                                                                                                                     
                                                                                                     
                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                                           
                                                                                                  
                                                                                                     



                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                             




                                                                                                                                                                                                                                                                                                                                                                                                  
                                                                                                                            








                                                                                                                                                                                                                                                                                                                                                                                                  
                                                                                                                              






                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                              
                                                                                             
                                                                                                             
                                                                                                     

                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                  
                                                                                                              
                                                                                                                              






                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                              
                                                                                             
                                                                                                             
                                                                                                     



                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                              

























                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                  


                                                                                                                                       
                                                                                                                              


















                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                                            







                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                                            







                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                                            
































                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                              
                                                                                             
                                                                                                                     
                                                                                                     

                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                  




                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                                           
                                                                                                  
                                                                                                     



                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                             




                                                                                                                                                                                                                                                                                                                                                                                                  
                                                                                                                            








                                                                                                                                                                                                                                                                                                                                                                                                  
                                                                                                                              






                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                              






                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                              






                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                              






                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                              





























                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                              
                                                                                             
                                                                                                                  
                                                                                                     




                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                             
                                                                                                                  
                                                                                                     







                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                                            







                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                                            







                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                                            






                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                                                                                                                                                        


                                                                                                                           
                                                                                                                                     


























                                                                                                                                                                                                                                                                                                                                                                                                 
                                                                                                                                       



                                                                                                                                                                                                                                                                                                                                                                                                     
                                                                                                 





















                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                                                                                                                                                           
                                                                                             

                                                                                                                                                    









                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                                             








                                                                                                                                                                                                                                                                                                                                                                          
                                                                                                           



                                                                                                                                                                                                                                                                                                                                                                                           


                                                                                                                                                                                                                                                                                                                                                       







                                                                                                                                                                                                                                                                                                                                                                                                                                                                                

                                                                                                                                                                                                                                                                                                                                                       

























                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                                                                                                                         
                                                                                              




                                                                                                                                  
                                                                                                                                 
                                                                                                               
                                                                                         
                                                                                                               










                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                                

                                                                                                                                                                                                                                                                                                                                                                         


                                                                                                                                                                                                                                                                                                                                                        

                                                                                                                                                                                                                                                                                                                                                                         




                                                                                                                                                                                                                                                                                                                                                       

                                                                                                                                                                                                                                                                                                                                                                          



                                                                                                                                                                                                                                                                                                                                                        










                                                                                                                                                                                                                                                                                                                                                                                                 

                                                                                                                        
                                                                                                       

                                                                                                                                                                                                                                                                                                                                                                               

                                                                                                              

                                                                                                                                                                                                                                                                                                                                                                               



























                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                                                                                                         









                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                            



                                                                                                                                                                                                                                                                                                                                                                                                 
                                                                                                                            





                                                                                                                                                                                                                                                                                                                                                                                                     
                                                                                              






                                                                                                                                                                                                                                                                                                                                                                                                     
                                                                                              






                                                                                                                                                                                                                                                                                                                                                                                                     
                                                                                              






                                                                                                                                                                                                                                                                                                                                                                                                     
                                                                                              





















                                                                                                                                                                                                                                                                                                                                                                                                 
                                                                                                               










                                                                                                                                                                                                                                                                                                                                                                                           

                                                                                                 

                                                                                                                 
                                                                                                                                                                                                                       





                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                                                                                                                                                                                                                                                                                                                    






                                                                                                                                                                                                                                                                                                                                                                                               
                                                                                                                                                                                                                                                                                                                                                                                                                    






                                                                                                                                                                                                                                                                                                                                                                                               
                                                                                                                                                                                                                                                                                                                                                                                                                    






                                                                                                                                                                                                                                                                                                                                                                                               
                                                                                                                                                                                                                                                                                                                                                                                                                    
                                                                                             
                                                                                                                        





                                                                                                                                                                                                                                                                                                                                                                                               
                                                                                                             













                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                                                                                                                                                                                                                                                                                               

                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                  














                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                             






                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                                                                                                             





                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                                                                                                                                                                                                                                                                                                                    






                                                                                                                                                                                                                                                                                                                                                                                               
                                                                                                                                                                                                                                                                                                                                                                                                                    
                                                                                             
                                                                                                                        




                                                                                                                                                                                                                                                                                                                                                                                               
                                                                                                                                                                                                                                                                                                                                                                                                                    






                                                                                                                                                                                                                                                                                                                                                                                               
                                                                                                                                                                                                                                                                                                                                                                                                                    
                                                                                             
                                                                                                                        





                                                                                                                                                                                                                                                                                                                                                                                               
                                                                                                             













                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                                                                                                                                                                                                                                                                                               

                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                  














                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                             






                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                                                                                                                               





                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                                                                                                                                                                                                                                                                                                                    






                                                                                                                                                                                                                                                                                                                                                                                               
                                                                                                                                                                                                                                                                                                                                                                                                                    
                                                                                             
                                                                                                                    




                                                                                                                                                                                                                                                                                                                                                                                               
                                                                                                                                                                                                                                                                                                                                                                                                                    






                                                                                                                                                                                                                                                                                                                                                                                               
                                                                                                                                                                                                                                                                                                                                                                                                                    
                                                                                             
                                                                                                                    





                                                                                                                                                                                                                                                                                                                                                                                               
                                                                                                             













                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                                                                                                                                                                                                                                                                                               





                                                                                                                                                                                                                                                                                                                                                                                                 
                                                                                                                 







                                                                                                                                                                                                                                                                                                                                                                                                 
                                                                                                                 



















                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                             






                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                                                                                                                      





                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                                                                                                                                                                                                                                                                                                                    






                                                                                                                                                                                                                                                                                                                                                                                               
                                                                                                                                                                                                                                                                                                                                                                                                                    
                                                                                             
                                                                                                                    




                                                                                                                                                                                                                                                                                                                                                                                               
                                                                                                                                                                                                                                                                                                                                                                                                                    






                                                                                                                                                                                                                                                                                                                                                                                               
                                                                                                                                                                                                                                                                                                                                                                                                                    
                                                                                             
                                                                                                                        





                                                                                                                                                                                                                                                                                                                                                                                               
                                                                                                             













                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                                                                                                                                                                                                                                                                                               





                                                                                                                                                                                                                                                                                                                                                                                                 
                                                                                                                 



















                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                             






                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                                                                                                                                





                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                                                                                                                                                                                                                                                                                                                    






                                                                                                                                                                                                                                                                                                                                                                                               
                                                                                                                                                                                                                                                                                                                                                                                                                    
                                                                                             
                                                                                                                    




                                                                                                                                                                                                                                                                                                                                                                                               
                                                                                                                                                                                                                                                                                                                                                                                                                    






                                                                                                                                                                                                                                                                                                                                                                                               
                                                                                                                                                                                                                                                                                                                                                                                                                    







                                                                                                                                                                                                                                                                                                                                                                                               
                                                                                                             













                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                                                                                                                                                                                                                                                                                               





                                                                                                                                                                                                                                                                                                                                                                                                 
                                                                                                                 



















                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                             






                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                                                                      























                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                             































                                                                                                                                                                                                                                                                                                                                                                                                

                                                                                                              

                                                                                                                        
                                                                                   








                                                                                                                                                                                                                                                                                                                                                                                                        
                                                                                  








                                                                                                                                                                                                                                                                                                                                                                                            
                                                                                  








                                                                                                                                      
                                                                                                                     

                                                                                                                                                                                                                                                                                                                                                                                           

                                                                                                              

                                                                                                                        
                                                                                   







                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                                   































                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                              




                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                  







                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                              








                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                             
                                                                                                                       
                                                                                                     













                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                              














                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                              





                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                              








                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                             
                                                                                                                       
                                                                                                     













                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                              














                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                              
                                                                                             
                                                                                                             
                                                                                                     


                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                              








                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                             
                                                                                                                       
                                                                                                     













                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                              














                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                              
                                                                                             
                                                                                                             
                                                                                                     


                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                              








                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                             
                                                                                                                       
                                                                                                     













                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                              














                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                              
                                                                                             
                                                                                                             
                                                                                                     


                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                              








                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                             
                                                                                                                       
                                                                                                     













                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                              














                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                              
                                                                                             
                                                                                                             
                                                                                                     


                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                              








                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                             
                                                                                                                       
                                                                                                     













                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                              














                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                              
                                                                                             
                                                                                                             
                                                                                                     


                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                              








                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                             
                                                                                                                       
                                                                                                     








                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                                        














                                                                                                                                                                                                                  
                                                                                       










                                                                                                                                                             
                                                                                       
















                                                                                                                                                                                                                                            
                                                                                        
                                                                                                                                                            
                                                                                       
                                                                                                                                                             


                                                                                                                                
                                                     


                                                                                                                                 






                                                                                                                                                                                  



                                     
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - apps/survey.subx</title>
<meta name="Generator" content="Vim/8.1">
<meta name="plugin-version" content="vim8.1_v1">
<meta name="syntax" content="none">
<meta name="settings" content="number_lines,use_css,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
<meta name="colorscheme" content="minimal-light">
<style type="text/css">
<!--
pre { font-family: monospace; color: #000000; background-color: #c6c6c6; }
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #c6c6c6; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.subxS2Comment { color: #8a8a8a; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.LineNr { }
.subxS1Comment { color: #0000af; }
.CommentedCode { color: #8a8a8a; }
.SpecialChar { color: #d70000; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Folded { color: #080808; background-color: #949494; }
.Constant { color: #008787; }
.subxTest { color: #5f8700; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
-->
</style>

<script type='text/javascript'>
<!--

/* function to open any folds containing a jumped-to line before jumping to it */
function JumpToLine()
{
  var lineNum;
  lineNum = window.location.hash;
  lineNum = lineNum.substr(1); /* strip off '#' */

  if (lineNum.indexOf('L') == -1) {
    lineNum = 'L'+lineNum;
  }
  var lineElem = document.getElementById(lineNum);
  /* Always jump to new location even if the line was hidden inside a fold, or
   * we corrected the raw number to a line ID.
   */
  if (lineElem) {
    lineElem.scrollIntoView(true);
  }
  return true;
}
if ('onhashchange' in window) {
  window.onhashchange = JumpToLine;
}

-->
</script>
</head>
<body onload='JumpToLine();'>
<a href='https://github.com/akkartik/mu/blob/master/apps/survey.subx'>https://github.com/akkartik/mu/blob/master/apps/survey.subx</a>
<pre id='vimCodeElement'>
<span id="L1" class="LineNr">   1 </span><span class="subxComment"># Assign addresses (co-ordinates) to instructions (landmarks) in a program</span>
<span id="L2" class="LineNr">   2 </span><span class="subxComment"># (landscape).</span>
<span id="L3" class="LineNr">   3 </span><span class="subxComment"># Use the addresses assigned to:</span>
<span id="L4" class="LineNr">   4 </span><span class="subxComment">#   a) replace labels</span>
<span id="L5" class="LineNr">   5 </span><span class="subxComment">#   b) add segment headers with addresses and offsets correctly filled in</span>
<span id="L6" class="LineNr">   6 </span><span class="subxComment">#</span>
<span id="L7" class="LineNr">   7 </span><span class="subxComment"># To build:</span>
<span id="L8" class="LineNr">   8 </span><span class="subxComment">#   $ ./subx translate init.linux 0*.subx apps/subx-params.subx apps/survey.subx  -o apps/survey</span>
<span id="L9" class="LineNr">   9 </span><span class="subxComment">#</span>
<span id="L10" class="LineNr">  10 </span><span class="subxComment"># The expected input is a stream of bytes with segment headers, comments and</span>
<span id="L11" class="LineNr">  11 </span><span class="subxComment"># some interspersed labels.</span>
<span id="L12" class="LineNr">  12 </span><span class="subxComment">#   $ cat x</span>
<span id="L13" class="LineNr">  13 </span><span class="subxComment">#   == code 0x1</span>
<span id="L14" class="LineNr">  14 </span><span class="subxComment">#   l1:</span>
<span id="L15" class="LineNr">  15 </span><span class="subxComment">#   aa bb l1/imm8</span>
<span id="L16" class="LineNr">  16 </span><span class="subxComment">#   cc dd l2/disp32</span>
<span id="L17" class="LineNr">  17 </span><span class="subxComment">#   l2:</span>
<span id="L18" class="LineNr">  18 </span><span class="subxComment">#   ee foo/imm32</span>
<span id="L19" class="LineNr">  19 </span><span class="subxComment">#   == data 0x10</span>
<span id="L20" class="LineNr">  20 </span><span class="subxComment">#   foo:</span>
<span id="L21" class="LineNr">  21 </span><span class="subxComment">#     00</span>
<span id="L22" class="LineNr">  22 </span><span class="subxComment">#</span>
<span id="L23" class="LineNr">  23 </span><span class="subxComment"># The output is the stream of bytes without segment headers or label definitions,</span>
<span id="L24" class="LineNr">  24 </span><span class="subxComment"># and with label references replaced with numeric values/displacements.</span>
<span id="L25" class="LineNr">  25 </span><span class="subxComment">#</span>
<span id="L26" class="LineNr">  26 </span><span class="subxComment">#   $ cat x  |./subx run apps/survey</span>
<span id="L27" class="LineNr">  27 </span><span class="subxComment">#   ...ELF header bytes...</span>
<span id="L28" class="LineNr">  28 </span><span class="subxComment">#   # ELF header above will specify that code segment begins at this offset</span>
<span id="L29" class="LineNr">  29 </span><span class="subxComment">#   aa bb nn  # some computed address</span>
<span id="L30" class="LineNr">  30 </span><span class="subxComment">#   cc dd nn nn nn nn  # some computed displacement</span>
<span id="L31" class="LineNr">  31 </span><span class="subxComment">#   ee nn nn nn nn  # some computed address</span>
<span id="L32" class="LineNr">  32 </span><span class="subxComment">#   # ELF header above will specify that data segment begins at this offset</span>
<span id="L33" class="LineNr">  33 </span><span class="subxComment">#   00</span>
<span id="L34" class="LineNr">  34 </span><span class="subxComment">#</span>
<span id="L35" class="LineNr">  35 </span><span class="subxComment"># The ELF format has some persnickety constraints on the starting addresses of</span>
<span id="L36" class="LineNr">  36 </span><span class="subxComment"># segments, so input headers are treated as guidelines and adjusted in the</span>
<span id="L37" class="LineNr">  37 </span><span class="subxComment"># output.</span>
<span id="L38" class="LineNr">  38 </span>
<span id="L39" class="LineNr">  39 </span>== code
<span id="L40" class="LineNr">  40 </span><span class="subxComment">#   instruction                     effective address                                                   register    displacement    immediate</span>
<span id="L41" class="LineNr">  41 </span><span class="subxS1Comment"># . op          subop               mod             rm32          base        index         scale       r32</span>
<span id="L42" class="LineNr">  42 </span><span class="subxS1Comment"># . 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</span>
<span id="L43" class="LineNr">  43 </span>
<span id="L44" class="LineNr">  44 </span><span class="SpecialChar">Entry</span>:  <span class="subxComment"># run tests if necessary, convert stdin if not</span>
<span id="L45" class="LineNr">  45 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L46" class="LineNr">  46 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L47" class="LineNr">  47 </span>
<span id="L48" class="LineNr">  48 </span>    <span class="subxComment"># Heap = new-segment(Heap-size)</span>
<span id="L49" class="LineNr">  49 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L50" class="LineNr">  50 </span>    68/push  <span class="SpecialChar"><a href='../069allocate.subx.html#L22'>Heap</a></span>/imm32
<span id="L51" class="LineNr">  51 </span>    ff          6/subop/push        0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          <span class="SpecialChar"><a href='../069allocate.subx.html#L29'>Heap-size</a></span>/disp32                  <span class="subxComment"># push *Heap-size</span>
<span id="L52" class="LineNr">  52 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L53" class="LineNr">  53 </span>    e8/call  <a href='../053new-segment.subx.html#L41'>new-segment</a>/disp32
<span id="L54" class="LineNr">  54 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L55" class="LineNr">  55 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L56" class="LineNr">  56 </span>    <span class="subxComment"># initialize-trace-stream(Trace-size)</span>
<span id="L57" class="LineNr">  57 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L58" class="LineNr">  58 </span>    ff          6/subop/push        0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          <span class="SpecialChar">Trace-size</span>/disp32                 <span class="subxComment"># push *Heap-size</span>
<span id="L59" class="LineNr">  59 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L60" class="LineNr">  60 </span>    e8/call  <a href='../056trace.subx.html#L48'>initialize-trace-stream</a>/disp32
<span id="L61" class="LineNr">  61 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L62" class="LineNr">  62 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L63" class="LineNr">  63 </span>
<span id="L64" class="LineNr">  64 </span>    <span class="subxH1Comment"># - if argc &gt; 1 and argv[1] == &quot;test&quot;, then return run_tests()</span>
<span id="L65" class="LineNr">  65 </span>    <span class="subxComment"># if (argc &lt;= 1) goto interactive</span>
<span id="L66" class="LineNr">  66 </span>    81          7/subop/compare     1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0/disp8         1/imm32           <span class="subxComment"># compare *ebp</span>
<span id="L67" class="LineNr">  67 </span>    7e/jump-if-&lt;=  $subx-survey-main:interactive/disp8
<span id="L68" class="LineNr">  68 </span>    <span class="subxComment"># if (!kernel-string-equal?(argv[1], &quot;test&quot;)) goto interactive</span>
<span id="L69" class="LineNr">  69 </span>    <span class="subxS1Comment"># . eax = kernel-string-equal?(argv[1], &quot;test&quot;)</span>
<span id="L70" class="LineNr">  70 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L71" class="LineNr">  71 </span>    68/push  <span class="Constant">&quot;test&quot;</span>/imm32
<span id="L72" class="LineNr">  72 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+8)</span>
<span id="L73" class="LineNr">  73 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L74" class="LineNr">  74 </span>    e8/call  <a href='../052kernel-string-equal.subx.html#L33'>kernel-string-equal?</a>/disp32
<span id="L75" class="LineNr">  75 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L76" class="LineNr">  76 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L77" class="LineNr">  77 </span>    <span class="subxS1Comment"># . if (eax == false) goto interactive</span>
<span id="L78" class="LineNr">  78 </span>    3d/compare-eax-and  0/imm32/false
<span id="L79" class="LineNr">  79 </span>    74/jump-if-=  $subx-survey-main:interactive/disp8
<span id="L80" class="LineNr">  80 </span>    <span class="subxComment"># run-tests()</span>
<span id="L81" class="LineNr">  81 </span>    e8/call  run-tests/disp32
<span id="L82" class="LineNr">  82 </span>    <span class="subxComment"># syscall(exit, *Num-test-failures)</span>
<span id="L83" class="LineNr">  83 </span>    8b/copy                         0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>          3/r32/ebx   <span class="SpecialChar"><a href='../051test.subx.html#L90'>Num-test-failures</a></span>/disp32          <span class="subxComment"># copy *Num-test-failures to ebx</span>
<span id="L84" class="LineNr">  84 </span>    eb/jump  $subx-survey-main:end/disp8
<span id="L85" class="LineNr">  85 </span><span class="Constant">$subx-survey-main:interactive</span>:
<span id="L86" class="LineNr">  86 </span>    <span class="subxH1Comment"># - otherwise convert stdin</span>
<span id="L87" class="LineNr">  87 </span>    <span class="subxComment"># subx-survey(Stdin, Stdout)</span>
<span id="L88" class="LineNr">  88 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L89" class="LineNr">  89 </span>    68/push  <span class="SpecialChar"><a href='../064write-byte.subx.html#L10'>Stdout</a></span>/imm32
<span id="L90" class="LineNr">  90 </span>    68/push  <span class="SpecialChar"><a href='../061read-byte.subx.html#L14'>Stdin</a></span>/imm32
<span id="L91" class="LineNr">  91 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L92" class="LineNr">  92 </span>    e8/call  <a href='survey.subx.html#L116'>subx-survey</a>/disp32
<span id="L93" class="LineNr">  93 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L94" class="LineNr">  94 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L95" class="LineNr">  95 </span><span class="CommentedCode">#?     # . write-stream(2/stderr, Trace-stream)</span>
<span id="L96" class="LineNr">  96 </span><span class="CommentedCode">#?     # . . push args</span>
<span id="L97" class="LineNr">  97 </span><span class="CommentedCode">#?     ff          6/subop/push        0/mod/indirect  5/rm32/.disp32            .             .           .           Trace-stream/disp32               # push *Trace-stream</span>
<span id="L98" class="LineNr">  98 </span><span class="CommentedCode">#?     68/push  2/imm32/stderr</span>
<span id="L99" class="LineNr">  99 </span><span class="CommentedCode">#?     # . . call</span>
<span id="L100" class="LineNr"> 100 </span><span class="CommentedCode">#?     e8/call  write-stream/disp32</span>
<span id="L101" class="LineNr"> 101 </span><span class="CommentedCode">#?     # . . discard args</span>
<span id="L102" class="LineNr"> 102 </span><span class="CommentedCode">#?     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           # add to esp</span>
<span id="L103" class="LineNr"> 103 </span>    <span class="subxComment"># syscall(exit, 0)</span>
<span id="L104" class="LineNr"> 104 </span>    bb/copy-to-ebx  0/imm32
<span id="L105" class="LineNr"> 105 </span><span class="Constant">$subx-survey-main:end</span>:
<span id="L106" class="LineNr"> 106 </span>    b8/copy-to-eax  1/imm32/exit
<span id="L107" class="LineNr"> 107 </span>    cd/syscall  0x80/imm8
<span id="L108" class="LineNr"> 108 </span>
<span id="L109" class="LineNr"> 109 </span><span class="subxComment"># data structures:</span>
<span id="L110" class="LineNr"> 110 </span><span class="subxComment">#   segment-info: {addr, file-offset, size}            (12 bytes)</span>
<span id="L111" class="LineNr"> 111 </span><span class="subxComment">#   segments: (addr stream {string, segment-info})     (16 bytes per row)</span>
<span id="L112" class="LineNr"> 112 </span><span class="subxComment">#   label-info: {segment-name, segment-offset, addr}   (12 bytes)</span>
<span id="L113" class="LineNr"> 113 </span><span class="subxComment">#   labels: (addr stream {string, label-info})         (16 bytes per row)</span>
<span id="L114" class="LineNr"> 114 </span><span class="subxComment"># these are all inefficient; use sequential scans for lookups</span>
<span id="L115" class="LineNr"> 115 </span>
<span id="L116" class="LineNr"> 116 </span><span class="subxFunction">subx-survey</span>:  <span class="subxComment"># infile : (addr buffered-file), out : (addr buffered-file)</span>
<span id="L117" class="LineNr"> 117 </span>    <span class="subxComment"># pseudocode</span>
<span id="L118" class="LineNr"> 118 </span>    <span class="subxComment">#   var in : (stream byte 4096)</span>
<span id="L119" class="LineNr"> 119 </span>    <span class="subxComment">#   slurp(infile, in)</span>
<span id="L120" class="LineNr"> 120 </span>    <span class="subxComment">#   var segments : (stream segment-info)</span>
<span id="L121" class="LineNr"> 121 </span>    <span class="subxComment">#   var labels : (stream label-info Max-labels)</span>
<span id="L122" class="LineNr"> 122 </span>    <span class="subxComment">#   compute-offsets(in, segments, labels)</span>
<span id="L123" class="LineNr"> 123 </span>    <span class="subxComment">#   compute-addresses(segments, labels)</span>
<span id="L124" class="LineNr"> 124 </span>    <span class="subxComment">#   rewind-stream(in)</span>
<span id="L125" class="LineNr"> 125 </span>    <span class="subxComment">#   emit-output(in, out, segments, labels)</span>
<span id="L126" class="LineNr"> 126 </span>    <span class="subxComment">#</span>
<span id="L127" class="LineNr"> 127 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L128" class="LineNr"> 128 </span>    55/push-ebp
<span id="L129" class="LineNr"> 129 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L130" class="LineNr"> 130 </span>    <span class="subxS1Comment"># . save registers</span>
<span id="L131" class="LineNr"> 131 </span>    51/push-ecx
<span id="L132" class="LineNr"> 132 </span>    52/push-edx
<span id="L133" class="LineNr"> 133 </span>    56/push-esi
<span id="L134" class="LineNr"> 134 </span>    <span class="subxComment"># var segments/ecx : (stream {string, segment-info} 160)   # 10 rows * 16 bytes/row</span>
<span id="L135" class="LineNr"> 135 </span>    81          5/subop/subtract    3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xa0/imm32        <span class="subxComment"># subtract from esp</span>
<span id="L136" class="LineNr"> 136 </span>    68/push  0xa0/imm32/length
<span id="L137" class="LineNr"> 137 </span>    68/push  0/imm32/read
<span id="L138" class="LineNr"> 138 </span>    68/push  0/imm32/write
<span id="L139" class="LineNr"> 139 </span>    89/copy                         3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ecx</span>
<span id="L140" class="LineNr"> 140 </span>    <span class="subxComment"># var labels/edx : (stream label-info Max-labels*16)</span>
<span id="L141" class="LineNr"> 141 </span>    <span class="subxS1Comment"># . data</span>
<span id="L142" class="LineNr"> 142 </span>    2b/subtract                     0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp   <span class="SpecialChar">Max-labels</span>/disp32                 <span class="subxComment"># subtract *Max-labels from esp</span>
<span id="L143" class="LineNr"> 143 </span>    <span class="subxS1Comment"># . length</span>
<span id="L144" class="LineNr"> 144 </span>    ff          6/subop/push        0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          <span class="SpecialChar">Max-labels</span>/disp32                 <span class="subxComment"># push *Max-labels</span>
<span id="L145" class="LineNr"> 145 </span>    <span class="subxS1Comment"># . read</span>
<span id="L146" class="LineNr"> 146 </span>    68/push  0/imm32/read
<span id="L147" class="LineNr"> 147 </span>    <span class="subxS1Comment"># . write</span>
<span id="L148" class="LineNr"> 148 </span>    68/push  0/imm32/write
<span id="L149" class="LineNr"> 149 </span>    89/copy                         3/mod/direct    2/rm32/edx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to edx</span>
<span id="L150" class="LineNr"> 150 </span>    <span class="subxComment"># var in/esi : (stream byte Input-size)</span>
<span id="L151" class="LineNr"> 151 </span>    <span class="subxS1Comment"># . data</span>
<span id="L152" class="LineNr"> 152 </span>    2b/subtract                     0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp   <span class="SpecialChar">Input-size</span>/disp32                 <span class="subxComment"># subtract *Input-size from esp</span>
<span id="L153" class="LineNr"> 153 </span>    <span class="subxS1Comment"># . length</span>
<span id="L154" class="LineNr"> 154 </span>    ff          6/subop/push        0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          <span class="SpecialChar">Input-size</span>/disp32                 <span class="subxComment"># push *Input-size</span>
<span id="L155" class="LineNr"> 155 </span>    <span class="subxS1Comment"># . read</span>
<span id="L156" class="LineNr"> 156 </span>    68/push  0/imm32/read
<span id="L157" class="LineNr"> 157 </span>    <span class="subxS1Comment"># . write</span>
<span id="L158" class="LineNr"> 158 </span>    68/push  0/imm32/write
<span id="L159" class="LineNr"> 159 </span>    89/copy                         3/mod/direct    6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to esi</span>
<span id="L160" class="Folded"> 160 </span><span class="Folded">+-- 41 lines: #?     # dump labels-&gt;write --------------------------------------------------------------------------------------------------------------------</span>
<span id="L201" class="Folded"> 201 </span><span class="Folded">+--  9 lines: #?     # write(2/stderr, &quot;slurp in\n&quot;) ---------------------------------------------------------------------------------------------------------</span>
<span id="L210" class="LineNr"> 210 </span>    <span class="subxComment"># slurp(infile, in)</span>
<span id="L211" class="LineNr"> 211 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L212" class="LineNr"> 212 </span>    56/push-esi
<span id="L213" class="LineNr"> 213 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+8)</span>
<span id="L214" class="LineNr"> 214 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L215" class="LineNr"> 215 </span>    e8/call  <a href='../082slurp.subx.html#L8'>slurp</a>/disp32
<span id="L216" class="LineNr"> 216 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L217" class="LineNr"> 217 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L218" class="Folded"> 218 </span><span class="Folded">+-- 40 lines: #?     # dump labels-&gt;write --------------------------------------------------------------------------------------------------------------------</span>
<span id="L258" class="Folded"> 258 </span><span class="Folded">+-- 33 lines: #?     # dump in -------------------------------------------------------------------------------------------------------------------------------</span>
<span id="L291" class="Folded"> 291 </span><span class="Folded">+--  9 lines: #?     # write(2/stderr, &quot;compute-offsets\n&quot;) --------------------------------------------------------------------------------------------------</span>
<span id="L300" class="LineNr"> 300 </span>    <span class="subxComment"># compute-offsets(in, segments, labels)</span>
<span id="L301" class="LineNr"> 301 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L302" class="LineNr"> 302 </span>    52/push-edx
<span id="L303" class="LineNr"> 303 </span>    51/push-ecx
<span id="L304" class="LineNr"> 304 </span>    56/push-esi
<span id="L305" class="LineNr"> 305 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L306" class="LineNr"> 306 </span>    e8/call  <a href='survey.subx.html#L621'>compute-offsets</a>/disp32
<span id="L307" class="LineNr"> 307 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L308" class="LineNr"> 308 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L309" class="Folded"> 309 </span><span class="Folded">+--  9 lines: #?     # write(2/stderr, &quot;compute-addresses\n&quot;) ------------------------------------------------------------------------------------------------</span>
<span id="L318" class="LineNr"> 318 </span>    <span class="subxComment"># compute-addresses(segments, labels)</span>
<span id="L319" class="LineNr"> 319 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L320" class="LineNr"> 320 </span>    52/push-edx
<span id="L321" class="LineNr"> 321 </span>    51/push-ecx
<span id="L322" class="LineNr"> 322 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L323" class="LineNr"> 323 </span>    e8/call  <a href='survey.subx.html#L1381'>compute-addresses</a>/disp32
<span id="L324" class="LineNr"> 324 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L325" class="LineNr"> 325 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L326" class="LineNr"> 326 </span>    <span class="subxComment"># rewind-stream(in)</span>
<span id="L327" class="LineNr"> 327 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L328" class="LineNr"> 328 </span>    56/push-esi
<span id="L329" class="LineNr"> 329 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L330" class="LineNr"> 330 </span>    e8/call  <a href='../055stream.subx.html#L54'>rewind-stream</a>/disp32
<span id="L331" class="LineNr"> 331 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L332" class="LineNr"> 332 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L333" class="Folded"> 333 </span><span class="Folded">+--  9 lines: #?     # write(2/stderr, &quot;emit-output\n&quot;) ------------------------------------------------------------------------------------------------------</span>
<span id="L342" class="Folded"> 342 </span><span class="Folded">+-- 26 lines: #?     # dump *Trace-stream --------------------------------------------------------------------------------------------------------------------</span>
<span id="L368" class="Folded"> 368 </span><span class="Folded">+-- 40 lines: #?     # dump labels-&gt;write --------------------------------------------------------------------------------------------------------------------</span>
<span id="L408" class="LineNr"> 408 </span>    <span class="subxComment"># emit-output(in, out, segments, labels)</span>
<span id="L409" class="LineNr"> 409 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L410" class="LineNr"> 410 </span>    52/push-edx
<span id="L411" class="LineNr"> 411 </span>    51/push-ecx
<span id="L412" class="LineNr"> 412 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+12)</span>
<span id="L413" class="LineNr"> 413 </span>    56/push-esi
<span id="L414" class="LineNr"> 414 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L415" class="LineNr"> 415 </span>    e8/call  <a href='survey.subx.html#L1874'>emit-output</a>/disp32
<span id="L416" class="LineNr"> 416 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L417" class="LineNr"> 417 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x10/imm32        <span class="subxComment"># add to esp</span>
<span id="L418" class="LineNr"> 418 </span>    <span class="subxComment"># flush(out)</span>
<span id="L419" class="LineNr"> 419 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L420" class="LineNr"> 420 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+12)</span>
<span id="L421" class="LineNr"> 421 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L422" class="LineNr"> 422 </span>    e8/call  <a href='../064write-byte.subx.html#L81'>flush</a>/disp32
<span id="L423" class="LineNr"> 423 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L424" class="LineNr"> 424 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L425" class="LineNr"> 425 </span><span class="Constant">$subx-survey:end</span>:
<span id="L426" class="LineNr"> 426 </span>    <span class="subxS1Comment"># . reclaim locals</span>
<span id="L427" class="LineNr"> 427 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x30a0/imm32      <span class="subxComment"># add to esp</span>
<span id="L428" class="LineNr"> 428 </span>    <span class="subxS1Comment"># . restore registers</span>
<span id="L429" class="LineNr"> 429 </span>    5e/pop-to-esi
<span id="L430" class="LineNr"> 430 </span>    5a/pop-to-edx
<span id="L431" class="LineNr"> 431 </span>    59/pop-to-ecx
<span id="L432" class="LineNr"> 432 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L433" class="LineNr"> 433 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L434" class="LineNr"> 434 </span>    5d/pop-to-ebp
<span id="L435" class="LineNr"> 435 </span>    c3/return
<span id="L436" class="LineNr"> 436 </span>
<span id="L437" class="LineNr"> 437 </span><span class="subxTest">test-subx-survey-computes-addresses</span>:
<span id="L438" class="LineNr"> 438 </span>    <span class="subxComment"># input:</span>
<span id="L439" class="LineNr"> 439 </span>    <span class="subxComment">#   == code 0x1</span>
<span id="L440" class="LineNr"> 440 </span>    <span class="subxComment">#   Entry:</span>
<span id="L441" class="LineNr"> 441 </span>    <span class="subxComment">#   ab x/imm32</span>
<span id="L442" class="LineNr"> 442 </span>    <span class="subxComment">#   == data 0x1000</span>
<span id="L443" class="LineNr"> 443 </span>    <span class="subxComment">#   x:</span>
<span id="L444" class="LineNr"> 444 </span>    <span class="subxComment">#     01</span>
<span id="L445" class="LineNr"> 445 </span>    <span class="subxComment">#</span>
<span id="L446" class="LineNr"> 446 </span>    <span class="subxComment"># trace contains (in any order):</span>
<span id="L447" class="LineNr"> 447 </span>    <span class="subxComment">#   label x is at address 0x1079</span>
<span id="L448" class="LineNr"> 448 </span>    <span class="subxComment">#   segment code starts at address 0x74</span>
<span id="L449" class="LineNr"> 449 </span>    <span class="subxComment">#   segment code has size 5</span>
<span id="L450" class="LineNr"> 450 </span>    <span class="subxComment">#   segment data starts at address 0x1079</span>
<span id="L451" class="LineNr"> 451 </span>    <span class="subxComment">#</span>
<span id="L452" class="LineNr"> 452 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L453" class="LineNr"> 453 </span>    55/push-ebp
<span id="L454" class="LineNr"> 454 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L455" class="LineNr"> 455 </span>    <span class="subxComment"># setup</span>
<span id="L456" class="LineNr"> 456 </span>    <span class="subxS1Comment"># . clear-stream(_test-input-stream)</span>
<span id="L457" class="LineNr"> 457 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L458" class="LineNr"> 458 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L459" class="LineNr"> 459 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L460" class="LineNr"> 460 </span>    e8/call  <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L461" class="LineNr"> 461 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L462" class="LineNr"> 462 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L463" class="LineNr"> 463 </span>    <span class="subxS1Comment"># . clear-stream($_test-input-buffered-file-&gt;buffer)</span>
<span id="L464" class="LineNr"> 464 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L465" class="LineNr"> 465 </span>    68/push  $_test-input-buffered-file-&gt;buffer/imm32
<span id="L466" class="LineNr"> 466 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L467" class="LineNr"> 467 </span>    e8/call  <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L468" class="LineNr"> 468 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L469" class="LineNr"> 469 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L470" class="LineNr"> 470 </span>    <span class="subxS1Comment"># . clear-stream(_test-output-stream)</span>
<span id="L471" class="LineNr"> 471 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L472" class="LineNr"> 472 </span>    68/push  <a href='../064write-byte.subx.html#L286'>_test-output-stream</a>/imm32
<span id="L473" class="LineNr"> 473 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L474" class="LineNr"> 474 </span>    e8/call  <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L475" class="LineNr"> 475 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L476" class="LineNr"> 476 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L477" class="LineNr"> 477 </span>    <span class="subxS1Comment"># . clear-stream($_test-output-buffered-file-&gt;buffer)</span>
<span id="L478" class="LineNr"> 478 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L479" class="LineNr"> 479 </span>    68/push  $_test-output-buffered-file-&gt;buffer/imm32
<span id="L480" class="LineNr"> 480 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L481" class="LineNr"> 481 </span>    e8/call  <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L482" class="LineNr"> 482 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L483" class="LineNr"> 483 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L484" class="LineNr"> 484 </span>    <span class="subxComment"># initialize input</span>
<span id="L485" class="LineNr"> 485 </span>    <span class="subxS1Comment"># . write(_test-input-stream, &quot;== code 0x1\n&quot;)</span>
<span id="L486" class="LineNr"> 486 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L487" class="LineNr"> 487 </span>    68/push  <span class="Constant">&quot;== code 0x1\n&quot;</span>/imm32
<span id="L488" class="LineNr"> 488 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L489" class="LineNr"> 489 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L490" class="LineNr"> 490 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L491" class="LineNr"> 491 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L492" class="LineNr"> 492 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L493" class="LineNr"> 493 </span>    <span class="subxS1Comment"># . write(_test-input-stream, &quot;Entry:\n&quot;)</span>
<span id="L494" class="LineNr"> 494 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L495" class="LineNr"> 495 </span>    68/push  <span class="Constant">&quot;Entry:\n&quot;</span>/imm32
<span id="L496" class="LineNr"> 496 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L497" class="LineNr"> 497 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L498" class="LineNr"> 498 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L499" class="LineNr"> 499 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L500" class="LineNr"> 500 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L501" class="LineNr"> 501 </span>    <span class="subxS1Comment"># . write(_test-input-stream, &quot;ab x/imm32\n&quot;)</span>
<span id="L502" class="LineNr"> 502 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L503" class="LineNr"> 503 </span>    68/push  <span class="Constant">&quot;ab x/imm32\n&quot;</span>/imm32
<span id="L504" class="LineNr"> 504 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L505" class="LineNr"> 505 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L506" class="LineNr"> 506 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L507" class="LineNr"> 507 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L508" class="LineNr"> 508 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L509" class="LineNr"> 509 </span>    <span class="subxS1Comment"># . write(_test-input-stream, &quot;== data 0x1000\n&quot;)</span>
<span id="L510" class="LineNr"> 510 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L511" class="LineNr"> 511 </span>    68/push  <span class="Constant">&quot;== data 0x1000\n&quot;</span>/imm32
<span id="L512" class="LineNr"> 512 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L513" class="LineNr"> 513 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L514" class="LineNr"> 514 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L515" class="LineNr"> 515 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L516" class="LineNr"> 516 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L517" class="LineNr"> 517 </span>    <span class="subxS1Comment"># . write(_test-input-stream, &quot;x:\n&quot;)</span>
<span id="L518" class="LineNr"> 518 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L519" class="LineNr"> 519 </span>    68/push  <span class="Constant">&quot;x:\n&quot;</span>/imm32
<span id="L520" class="LineNr"> 520 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L521" class="LineNr"> 521 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L522" class="LineNr"> 522 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L523" class="LineNr"> 523 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L524" class="LineNr"> 524 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L525" class="LineNr"> 525 </span>    <span class="subxS1Comment"># . write(_test-input-stream, &quot;01\n&quot;)</span>
<span id="L526" class="LineNr"> 526 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L527" class="LineNr"> 527 </span>    68/push  <span class="Constant">&quot;01\n&quot;</span>/imm32
<span id="L528" class="LineNr"> 528 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L529" class="LineNr"> 529 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L530" class="LineNr"> 530 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L531" class="LineNr"> 531 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L532" class="LineNr"> 532 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L533" class="LineNr"> 533 </span>    <span class="subxComment"># subx-survey(_test-input-buffered-file, _test-output-buffered-file)</span>
<span id="L534" class="LineNr"> 534 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L535" class="LineNr"> 535 </span>    68/push  <a href='../064write-byte.subx.html#L328'>_test-output-buffered-file</a>/imm32
<span id="L536" class="LineNr"> 536 </span>    68/push  <a href='../061read-byte.subx.html#L313'>_test-input-buffered-file</a>/imm32
<span id="L537" class="LineNr"> 537 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L538" class="LineNr"> 538 </span>    e8/call  <a href='survey.subx.html#L116'>subx-survey</a>/disp32
<span id="L539" class="LineNr"> 539 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L540" class="LineNr"> 540 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L541" class="LineNr"> 541 </span>    <span class="subxComment"># check trace</span>
<span id="L542" class="Folded"> 542 </span><span class="Folded">+-- 26 lines: #?     # dump *Trace-stream --------------------------------------------------------------------------------------------------------------------</span>
<span id="L568" class="LineNr"> 568 </span>    <span class="subxS1Comment"># . check-trace-contains(&quot;label 'x' is at address 0x00001079.&quot;, msg)</span>
<span id="L569" class="LineNr"> 569 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L570" class="LineNr"> 570 </span>    68/push  <span class="Constant">&quot;F - <a href='survey.subx.html#L437'>test-subx-survey-computes-addresses</a>/0&quot;</span>/imm32
<span id="L571" class="LineNr"> 571 </span>    68/push  <span class="Constant">&quot;label 'x' is at address 0x00001079.&quot;</span>/imm32
<span id="L572" class="LineNr"> 572 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L573" class="LineNr"> 573 </span>    e8/call  <a href='../056trace.subx.html#L253'>check-trace-contains</a>/disp32
<span id="L574" class="LineNr"> 574 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L575" class="LineNr"> 575 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L576" class="LineNr"> 576 </span>    <span class="subxS1Comment"># . check-trace-contains(&quot;segment 'code' starts at address 0x00000074.&quot;, msg)</span>
<span id="L577" class="LineNr"> 577 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L578" class="LineNr"> 578 </span>    68/push  <span class="Constant">&quot;F - <a href='survey.subx.html#L437'>test-subx-survey-computes-addresses</a>/1&quot;</span>/imm32
<span id="L579" class="LineNr"> 579 </span>    68/push  <span class="Constant">&quot;segment 'code' starts at address 0x00000074.&quot;</span>/imm32
<span id="L580" class="LineNr"> 580 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L581" class="LineNr"> 581 </span>    e8/call  <a href='../056trace.subx.html#L253'>check-trace-contains</a>/disp32
<span id="L582" class="LineNr"> 582 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L583" class="LineNr"> 583 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L584" class="LineNr"> 584 </span>    <span class="subxS1Comment"># . check-trace-contains(&quot;segment 'code' has size 0x00000005.&quot;, msg)</span>
<span id="L585" class="LineNr"> 585 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L586" class="LineNr"> 586 </span>    68/push  <span class="Constant">&quot;F - <a href='survey.subx.html#L437'>test-subx-survey-computes-addresses</a>/2&quot;</span>/imm32
<span id="L587" class="LineNr"> 587 </span>    68/push  <span class="Constant">&quot;segment 'code' has size 0x00000005.&quot;</span>/imm32
<span id="L588" class="LineNr"> 588 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L589" class="LineNr"> 589 </span>    e8/call  <a href='../056trace.subx.html#L253'>check-trace-contains</a>/disp32
<span id="L590" class="LineNr"> 590 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L591" class="LineNr"> 591 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L592" class="LineNr"> 592 </span>    <span class="subxS1Comment"># . check-trace-contains(&quot;segment 'data' starts at address 0x00001079.&quot;, msg)</span>
<span id="L593" class="LineNr"> 593 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L594" class="LineNr"> 594 </span>    68/push  <span class="Constant">&quot;F - <a href='survey.subx.html#L437'>test-subx-survey-computes-addresses</a>/3&quot;</span>/imm32
<span id="L595" class="LineNr"> 595 </span>    68/push  <span class="Constant">&quot;segment 'data' starts at address 0x00001079.&quot;</span>/imm32
<span id="L596" class="LineNr"> 596 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L597" class="LineNr"> 597 </span>    e8/call  <a href='../056trace.subx.html#L253'>check-trace-contains</a>/disp32
<span id="L598" class="LineNr"> 598 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L599" class="LineNr"> 599 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L600" class="LineNr"> 600 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L601" class="LineNr"> 601 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L602" class="LineNr"> 602 </span>    5d/pop-to-ebp
<span id="L603" class="LineNr"> 603 </span>    c3/return
<span id="L604" class="LineNr"> 604 </span>
<span id="L605" class="LineNr"> 605 </span><span class="subxComment"># global scratch space for compute-offsets in the data segment</span>
<span id="L606" class="LineNr"> 606 </span>== data
<span id="L607" class="LineNr"> 607 </span>
<span id="L608" class="LineNr"> 608 </span><span class="subxFunction">compute-offsets:file-offset</span>:  <span class="subxComment"># int</span>
<span id="L609" class="LineNr"> 609 </span>  0/imm32
<span id="L610" class="LineNr"> 610 </span><span class="subxFunction">compute-offsets:segment-offset</span>:  <span class="subxComment"># int</span>
<span id="L611" class="LineNr"> 611 </span>  0/imm32
<span id="L612" class="LineNr"> 612 </span><span class="subxFunction">compute-offsets:word-slice</span>:
<span id="L613" class="LineNr"> 613 </span>  0/imm32/start
<span id="L614" class="LineNr"> 614 </span>  0/imm32/end
<span id="L615" class="LineNr"> 615 </span><span class="subxFunction">compute-offsets:segment-tmp</span>:  <span class="subxComment"># slice</span>
<span id="L616" class="LineNr"> 616 </span>  0/imm32/start
<span id="L617" class="LineNr"> 617 </span>  0/imm32/end
<span id="L618" class="LineNr"> 618 </span>
<span id="L619" class="LineNr"> 619 </span>== code
<span id="L620" class="LineNr"> 620 </span>
<span id="L621" class="LineNr"> 621 </span><span class="subxFunction">compute-offsets</span>:  <span class="subxComment"># in : (addr stream byte), segments : (addr stream {string, segment-info}), labels : (addr stream {string, label-info})</span>
<span id="L622" class="LineNr"> 622 </span>    <span class="subxComment"># skeleton:</span>
<span id="L623" class="LineNr"> 623 </span>    <span class="subxComment">#   for lines in 'in'</span>
<span id="L624" class="LineNr"> 624 </span>    <span class="subxComment">#     for words in line</span>
<span id="L625" class="LineNr"> 625 </span>    <span class="subxComment">#       switch word</span>
<span id="L626" class="LineNr"> 626 </span>    <span class="subxComment">#         case 1</span>
<span id="L627" class="LineNr"> 627 </span>    <span class="subxComment">#         case 2</span>
<span id="L628" class="LineNr"> 628 </span>    <span class="subxComment">#         ...</span>
<span id="L629" class="LineNr"> 629 </span>    <span class="subxComment">#         default</span>
<span id="L630" class="LineNr"> 630 </span>    <span class="subxComment">#</span>
<span id="L631" class="LineNr"> 631 </span>    <span class="subxComment"># pseudocode:</span>
<span id="L632" class="LineNr"> 632 </span>    <span class="subxComment">#   curr-segment-name : (addr string) = 0</span>
<span id="L633" class="LineNr"> 633 </span>    <span class="subxComment">#   var line : (stream byte 512)</span>
<span id="L634" class="LineNr"> 634 </span>    <span class="subxComment">#   while true                                  # line loop</span>
<span id="L635" class="LineNr"> 635 </span>    <span class="subxComment">#     clear-stream(line)</span>
<span id="L636" class="LineNr"> 636 </span>    <span class="subxComment">#     read-line(in, line)</span>
<span id="L637" class="LineNr"> 637 </span>    <span class="subxComment">#     if (line-&gt;write == 0) break               # end of file</span>
<span id="L638" class="LineNr"> 638 </span>    <span class="subxComment">#     while true                                # word loop</span>
<span id="L639" class="LineNr"> 639 </span>    <span class="subxComment">#       word-slice = next-word(line)</span>
<span id="L640" class="LineNr"> 640 </span>    <span class="subxComment">#       if slice-empty?(word-slice)             # end of line</span>
<span id="L641" class="LineNr"> 641 </span>    <span class="subxComment">#         break</span>
<span id="L642" class="LineNr"> 642 </span>    <span class="subxComment">#       else if slice-starts-with?(word-slice, &quot;#&quot;)  # comment</span>
<span id="L643" class="LineNr"> 643 </span>    <span class="subxComment">#         break                                 # end of line</span>
<span id="L644" class="LineNr"> 644 </span>    <span class="subxComment">#       else if slice-equal?(word-slice, &quot;==&quot;)</span>
<span id="L645" class="LineNr"> 645 </span>    <span class="subxComment">#         if curr-segment-name != 0</span>
<span id="L646" class="LineNr"> 646 </span>    <span class="subxComment">#           seg = get-or-insert(segments, curr-segment-name)</span>
<span id="L647" class="LineNr"> 647 </span>    <span class="subxComment">#           seg-&gt;size = *file-offset - seg-&gt;file-offset</span>
<span id="L648" class="LineNr"> 648 </span>    <span class="subxComment">#           trace(&quot;segment '&quot;, curr-segment-name, &quot;' has size &quot;, seg-&gt;size)</span>
<span id="L649" class="LineNr"> 649 </span>    <span class="subxComment">#         segment-tmp = next-word(line)</span>
<span id="L650" class="LineNr"> 650 </span>    <span class="subxComment">#         curr-segment-name = slice-to-string(segment-tmp)</span>
<span id="L651" class="LineNr"> 651 </span>    <span class="subxComment">#         if empty?(curr-segment-name)</span>
<span id="L652" class="LineNr"> 652 </span>    <span class="subxComment">#           abort</span>
<span id="L653" class="LineNr"> 653 </span>    <span class="subxComment">#         segment-tmp = next-word(line)</span>
<span id="L654" class="LineNr"> 654 </span>    <span class="subxComment">#         if slice-empty?(segment-tmp)</span>
<span id="L655" class="LineNr"> 655 </span>    <span class="subxComment">#           abort</span>
<span id="L656" class="LineNr"> 656 </span>    <span class="subxComment">#         seg = get-or-insert(segments, curr-segment-name)</span>
<span id="L657" class="LineNr"> 657 </span>    <span class="subxComment">#         seg-&gt;starting-address = parse-hex-int(segment-tmp)</span>
<span id="L658" class="LineNr"> 658 </span>    <span class="subxComment">#         seg-&gt;file-offset = *file-offset</span>
<span id="L659" class="LineNr"> 659 </span>    <span class="subxComment">#         trace(&quot;segment '&quot;, curr-segment-name, &quot;' is at file offset &quot;, seg-&gt;file-offset)</span>
<span id="L660" class="LineNr"> 660 </span>    <span class="subxComment">#         segment-offset = 0</span>
<span id="L661" class="LineNr"> 661 </span>    <span class="subxComment">#         break  (next line)</span>
<span id="L662" class="LineNr"> 662 </span>    <span class="subxComment">#       else if is-label?(word-slice)</span>
<span id="L663" class="LineNr"> 663 </span>    <span class="subxComment">#         strip trailing ':' from word-slice</span>
<span id="L664" class="LineNr"> 664 </span>    <span class="subxComment">#         x : (addr label-info) = get-or-insert(labels, name)</span>
<span id="L665" class="LineNr"> 665 </span>    <span class="subxComment">#         x-&gt;segment-name = curr-segment-name</span>
<span id="L666" class="LineNr"> 666 </span>    <span class="subxComment">#         trace(&quot;label '&quot;, word-slice, &quot;' is in segment '&quot;, curr-segment-name, &quot;'.&quot;)</span>
<span id="L667" class="LineNr"> 667 </span>    <span class="subxComment">#         x-&gt;segment-offset = segment-offset</span>
<span id="L668" class="LineNr"> 668 </span>    <span class="subxComment">#         trace(&quot;label '&quot;, word-slice, &quot;' is at segment offset &quot;, segment-offset, &quot;.&quot;)</span>
<span id="L669" class="LineNr"> 669 </span>    <span class="subxComment">#         # labels occupy no space, so no need to increment offsets</span>
<span id="L670" class="LineNr"> 670 </span>    <span class="subxComment">#       else</span>
<span id="L671" class="LineNr"> 671 </span>    <span class="subxComment">#         width = compute-width-of-slice(word-slice)</span>
<span id="L672" class="LineNr"> 672 </span>    <span class="subxComment">#         *segment-offset += width</span>
<span id="L673" class="LineNr"> 673 </span>    <span class="subxComment">#         *file-offset += width</span>
<span id="L674" class="LineNr"> 674 </span>    <span class="subxComment">#</span>
<span id="L675" class="LineNr"> 675 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L676" class="LineNr"> 676 </span>    55/push-ebp
<span id="L677" class="LineNr"> 677 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L678" class="LineNr"> 678 </span>    <span class="subxS1Comment"># . save registers</span>
<span id="L679" class="LineNr"> 679 </span>    50/push-eax
<span id="L680" class="LineNr"> 680 </span>    51/push-ecx
<span id="L681" class="LineNr"> 681 </span>    52/push-edx
<span id="L682" class="LineNr"> 682 </span>    53/push-ebx
<span id="L683" class="LineNr"> 683 </span>    56/push-esi
<span id="L684" class="LineNr"> 684 </span>    57/push-edi
<span id="L685" class="LineNr"> 685 </span>    <span class="subxComment"># curr-segment-name/esi = 0</span>
<span id="L686" class="LineNr"> 686 </span>    31/xor                          3/mod/direct    6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          6/r32/esi  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># clear esi</span>
<span id="L687" class="LineNr"> 687 </span>    <span class="subxComment"># file-offset = 0</span>
<span id="L688" class="LineNr"> 688 </span>    c7          0/subop/copy        0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          <a href='survey.subx.html#L621'>compute-offsets</a>:file-offset/disp32  0/imm32               <span class="subxComment"># copy to *compute-offsets:word-slice</span>
<span id="L689" class="LineNr"> 689 </span>    <span class="subxComment"># segment-offset = 0</span>
<span id="L690" class="LineNr"> 690 </span>    c7          0/subop/copy        0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          <a href='survey.subx.html#L621'>compute-offsets</a>:segment-offset/disp32  0/imm32            <span class="subxComment"># copy to *compute-offsets:word-slice</span>
<span id="L691" class="LineNr"> 691 </span>    <span class="subxComment"># var line/ecx : (stream byte 512)</span>
<span id="L692" class="LineNr"> 692 </span>    81          5/subop/subtract    3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x200/imm32       <span class="subxComment"># subtract from esp</span>
<span id="L693" class="LineNr"> 693 </span>    68/push  0x200/imm32/length
<span id="L694" class="LineNr"> 694 </span>    68/push  0/imm32/read
<span id="L695" class="LineNr"> 695 </span>    68/push  0/imm32/write
<span id="L696" class="LineNr"> 696 </span>    89/copy                         3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ecx</span>
<span id="L697" class="LineNr"> 697 </span><span class="Constant">$compute-offsets:line-loop</span>:
<span id="L698" class="LineNr"> 698 </span>    <span class="subxComment"># clear-stream(line)</span>
<span id="L699" class="LineNr"> 699 </span>    51/push-ecx
<span id="L700" class="LineNr"> 700 </span>    e8/call  <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L701" class="LineNr"> 701 </span>    <span class="subxS1Comment"># . discard args</span>
<span id="L702" class="LineNr"> 702 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L703" class="LineNr"> 703 </span>    <span class="subxComment"># read-line(in, line)</span>
<span id="L704" class="LineNr"> 704 </span>    51/push-ecx
<span id="L705" class="LineNr"> 705 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+8)</span>
<span id="L706" class="LineNr"> 706 </span>    e8/call  <a href='../071read-line.subx.html#L219'>read-line</a>/disp32
<span id="L707" class="LineNr"> 707 </span>    <span class="subxS1Comment"># . discard args</span>
<span id="L708" class="LineNr"> 708 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L709" class="LineNr"> 709 </span>    <span class="subxComment"># if (line-&gt;write == 0) break</span>
<span id="L710" class="LineNr"> 710 </span>    8b/copy                         0/mod/indirect  1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *ecx to eax</span>
<span id="L711" class="LineNr"> 711 </span>    3d/compare-eax-and  0/imm32
<span id="L712" class="LineNr"> 712 </span>    0f 84/jump-if-=  $compute-offsets:break-line-loop/disp32
<span id="L713" class="Folded"> 713 </span><span class="Folded">+-- 33 lines: #?     # dump line -----------------------------------------------------------------------------------------------------------------------------</span>
<span id="L746" class="LineNr"> 746 </span><span class="Constant">$compute-offsets:word-loop</span>:
<span id="L747" class="LineNr"> 747 </span>    <span class="subxComment"># edx = word-slice</span>
<span id="L748" class="LineNr"> 748 </span>    ba/copy-to-edx  <a href='survey.subx.html#L621'>compute-offsets</a>:word-slice/imm32
<span id="L749" class="LineNr"> 749 </span>    <span class="subxComment"># next-word(line, word-slice/edx)</span>
<span id="L750" class="LineNr"> 750 </span>    52/push-edx
<span id="L751" class="LineNr"> 751 </span>    51/push-ecx
<span id="L752" class="LineNr"> 752 </span>    e8/call  <a href='../076next-word.subx.html#L10'>next-word</a>/disp32
<span id="L753" class="LineNr"> 753 </span>    <span class="subxS1Comment"># . discard args</span>
<span id="L754" class="LineNr"> 754 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L755" class="Folded"> 755 </span><span class="Folded">+-- 74 lines: #?     # dump word-slice and maybe curr-segment-name -------------------------------------------------------------------------------------------</span>
<span id="L829" class="LineNr"> 829 </span><span class="Constant">$compute-offsets:case-empty</span>:
<span id="L830" class="LineNr"> 830 </span>    <span class="subxComment"># if slice-empty?(word/edx) break</span>
<span id="L831" class="LineNr"> 831 </span>    <span class="subxS1Comment"># . eax = slice-empty?(word/edx)</span>
<span id="L832" class="LineNr"> 832 </span>    52/push-edx
<span id="L833" class="LineNr"> 833 </span>    e8/call  <a href='../072slice.subx.html#L9'>slice-empty?</a>/disp32
<span id="L834" class="LineNr"> 834 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L835" class="LineNr"> 835 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L836" class="LineNr"> 836 </span>    <span class="subxS1Comment"># . if (eax != false) break</span>
<span id="L837" class="LineNr"> 837 </span>    3d/compare-eax-and  0/imm32/false
<span id="L838" class="LineNr"> 838 </span>    0f 85/jump-if-!=  $compute-offsets:line-loop/disp32
<span id="L839" class="LineNr"> 839 </span><span class="Constant">$compute-offsets:case-comment</span>:
<span id="L840" class="LineNr"> 840 </span>    <span class="subxComment"># if slice-starts-with?(word-slice, &quot;#&quot;) continue</span>
<span id="L841" class="LineNr"> 841 </span>    68/push  <span class="Constant">&quot;#&quot;</span>/imm32
<span id="L842" class="LineNr"> 842 </span>    52/push-edx
<span id="L843" class="LineNr"> 843 </span>    e8/call  <a href='../072slice.subx.html#L487'>slice-starts-with?</a>/disp32
<span id="L844" class="LineNr"> 844 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L845" class="LineNr"> 845 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L846" class="LineNr"> 846 </span>    <span class="subxS1Comment"># . if (eax != false) break</span>
<span id="L847" class="LineNr"> 847 </span>    3d/compare-eax-and  0/imm32/false
<span id="L848" class="LineNr"> 848 </span>    0f 85/jump-if-!=  $compute-offsets:line-loop/disp32
<span id="L849" class="LineNr"> 849 </span><span class="Constant">$compute-offsets:case-segment-header</span>:
<span id="L850" class="LineNr"> 850 </span>    <span class="subxComment"># if (!slice-equal?(word-slice/edx, &quot;==&quot;)) goto next case</span>
<span id="L851" class="LineNr"> 851 </span>    <span class="subxS1Comment"># . eax = slice-equal?(word-slice/edx, &quot;==&quot;)</span>
<span id="L852" class="LineNr"> 852 </span>    68/push  <span class="Constant">&quot;==&quot;</span>/imm32
<span id="L853" class="LineNr"> 853 </span>    52/push-edx
<span id="L854" class="LineNr"> 854 </span>    e8/call  <a href='../072slice.subx.html#L120'>slice-equal?</a>/disp32
<span id="L855" class="LineNr"> 855 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L856" class="LineNr"> 856 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L857" class="LineNr"> 857 </span>    <span class="subxS1Comment"># . if (eax == false) goto next case</span>
<span id="L858" class="LineNr"> 858 </span>    3d/compare-eax-and  0/imm32/false
<span id="L859" class="LineNr"> 859 </span>    0f 84/jump-if-=  $compute-offsets:case-label/disp32
<span id="L860" class="LineNr"> 860 </span>    <span class="subxComment"># if (curr-segment-name == 0) goto construct-next-segment</span>
<span id="L861" class="LineNr"> 861 </span>    81          7/subop/compare     3/mod/direct    6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0/imm32           <span class="subxComment"># compare esi</span>
<span id="L862" class="LineNr"> 862 </span>    74/jump-if-=  $compute-offsets:construct-next-segment/disp8
<span id="L863" class="LineNr"> 863 </span>    <span class="subxComment"># seg/eax = get-or-insert(segments, curr-segment-name, row-size=16)</span>
<span id="L864" class="LineNr"> 864 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L865" class="LineNr"> 865 </span>    68/push  0x10/imm32/row-size
<span id="L866" class="LineNr"> 866 </span>    56/push-esi
<span id="L867" class="LineNr"> 867 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+12)</span>
<span id="L868" class="LineNr"> 868 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L869" class="LineNr"> 869 </span>    e8/call  <a href='../081table.subx.html#L404'>get-or-insert</a>/disp32
<span id="L870" class="LineNr"> 870 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L871" class="LineNr"> 871 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L872" class="LineNr"> 872 </span>    <span class="subxComment"># seg-&gt;size = file-offset - seg-&gt;file-offset</span>
<span id="L873" class="LineNr"> 873 </span>    <span class="subxS1Comment"># . save ecx</span>
<span id="L874" class="LineNr"> 874 </span>    51/push-ecx
<span id="L875" class="LineNr"> 875 </span>    <span class="subxS1Comment"># . ebx = *file-offset</span>
<span id="L876" class="LineNr"> 876 </span>    8b/copy                         0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>          3/r32/ebx   <a href='survey.subx.html#L621'>compute-offsets</a>:file-offset/disp32 <span class="subxComment"># copy *file-offset to ebx</span>
<span id="L877" class="LineNr"> 877 </span>    <span class="subxS1Comment"># . ecx = seg-&gt;file-offset</span>
<span id="L878" class="LineNr"> 878 </span>    8b/copy                         1/mod/*+disp8   0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(eax+4) to ecx</span>
<span id="L879" class="LineNr"> 879 </span>    <span class="subxS1Comment"># . ebx -= ecx</span>
<span id="L880" class="LineNr"> 880 </span>    29/subtract                     3/mod/direct    3/rm32/ebx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># subtract ecx from ebx</span>
<span id="L881" class="LineNr"> 881 </span>    <span class="subxS1Comment"># . seg-&gt;size = ebx</span>
<span id="L882" class="LineNr"> 882 </span>    89/copy                         1/mod/*+disp8   0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          3/r32/ebx   8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy ebx to *(eax+8)</span>
<span id="L883" class="LineNr"> 883 </span>    <span class="subxS1Comment"># . restore ecx</span>
<span id="L884" class="LineNr"> 884 </span>    59/pop-to-ecx
<span id="L885" class="LineNr"> 885 </span>    <span class="subxComment"># trace-sssns(&quot;segment '&quot;, curr-segment-name, &quot;' has size &quot;, seg-&gt;size, &quot;.&quot;)</span>
<span id="L886" class="LineNr"> 886 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L887" class="LineNr"> 887 </span>    68/push  <span class="Constant">&quot;.&quot;</span>/imm32
<span id="L888" class="LineNr"> 888 </span>    53/push-ebx
<span id="L889" class="LineNr"> 889 </span>    68/push  <span class="Constant">&quot;' has size &quot;</span>/imm32
<span id="L890" class="LineNr"> 890 </span>    56/push-esi
<span id="L891" class="LineNr"> 891 </span>    68/push  <span class="Constant">&quot;segment '&quot;</span>/imm32
<span id="L892" class="LineNr"> 892 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L893" class="LineNr"> 893 </span>    e8/call  <a href='survey.subx.html#L3557'>trace-sssns</a>/disp32
<span id="L894" class="LineNr"> 894 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L895" class="LineNr"> 895 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x14/imm32        <span class="subxComment"># add to esp</span>
<span id="L896" class="LineNr"> 896 </span><span class="Constant">$compute-offsets:construct-next-segment</span>:
<span id="L897" class="LineNr"> 897 </span>    <span class="subxComment"># next-word(line, segment-tmp)</span>
<span id="L898" class="LineNr"> 898 </span>    68/push  <a href='survey.subx.html#L621'>compute-offsets</a>:segment-tmp/imm32
<span id="L899" class="LineNr"> 899 </span>    51/push-ecx
<span id="L900" class="LineNr"> 900 </span>    e8/call  <a href='../076next-word.subx.html#L10'>next-word</a>/disp32
<span id="L901" class="LineNr"> 901 </span>    <span class="subxS1Comment"># . discard args</span>
<span id="L902" class="LineNr"> 902 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L903" class="Folded"> 903 </span><span class="Folded">+-- 45 lines: #?     # dump curr-segment-name if not null (clobbering eax) -----------------------------------------------------------------------------------</span>
<span id="L948" class="LineNr"> 948 </span><span class="Constant">$compute-offsets:update-curr-segment-name</span>:
<span id="L949" class="LineNr"> 949 </span>    <span class="subxComment"># curr-segment-name = slice-to-string(segment-tmp)</span>
<span id="L950" class="LineNr"> 950 </span>    <span class="subxS1Comment"># . eax = slice-to-string(Heap, segment-tmp)</span>
<span id="L951" class="LineNr"> 951 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L952" class="LineNr"> 952 </span>    68/push  <a href='survey.subx.html#L621'>compute-offsets</a>:segment-tmp/imm32
<span id="L953" class="LineNr"> 953 </span>    68/push  <span class="SpecialChar"><a href='../069allocate.subx.html#L22'>Heap</a></span>/imm32
<span id="L954" class="LineNr"> 954 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L955" class="LineNr"> 955 </span>    e8/call  <a href='../072slice.subx.html#L1044'>slice-to-string</a>/disp32
<span id="L956" class="LineNr"> 956 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L957" class="LineNr"> 957 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L958" class="LineNr"> 958 </span>    <span class="subxS1Comment"># . curr-segment-name = eax</span>
<span id="L959" class="LineNr"> 959 </span>    89/copy                         3/mod/direct    6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy eax to esi</span>
<span id="L960" class="LineNr"> 960 </span>    <span class="subxComment"># if empty?(curr-segment-name) abort</span>
<span id="L961" class="LineNr"> 961 </span>    <span class="subxS1Comment"># . if (eax == 0) abort</span>
<span id="L962" class="LineNr"> 962 </span>    3d/compare-eax-and  0/imm32
<span id="L963" class="LineNr"> 963 </span>    0f 84/jump-if-=  $compute-offsets:abort/disp32
<span id="L964" class="LineNr"> 964 </span>    <span class="subxComment"># next-word(line, segment-tmp)</span>
<span id="L965" class="LineNr"> 965 </span>    68/push  <a href='survey.subx.html#L621'>compute-offsets</a>:segment-tmp/imm32
<span id="L966" class="LineNr"> 966 </span>    51/push-ecx
<span id="L967" class="LineNr"> 967 </span>    e8/call  <a href='../076next-word.subx.html#L10'>next-word</a>/disp32
<span id="L968" class="LineNr"> 968 </span>    <span class="subxS1Comment"># . discard args</span>
<span id="L969" class="LineNr"> 969 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L970" class="LineNr"> 970 </span>    <span class="subxComment"># if slice-empty?(segment-tmp) abort</span>
<span id="L971" class="LineNr"> 971 </span>    <span class="subxS1Comment"># . eax = slice-empty?(segment-tmp)</span>
<span id="L972" class="LineNr"> 972 </span>    68/push  <a href='survey.subx.html#L621'>compute-offsets</a>:segment-tmp/imm32
<span id="L973" class="LineNr"> 973 </span>    e8/call  <a href='../072slice.subx.html#L9'>slice-empty?</a>/disp32
<span id="L974" class="LineNr"> 974 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L975" class="LineNr"> 975 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L976" class="LineNr"> 976 </span>    <span class="subxS1Comment"># . if (eax != false) abort</span>
<span id="L977" class="LineNr"> 977 </span>    3d/compare-eax-and  0/imm32/false
<span id="L978" class="LineNr"> 978 </span>    0f 85/jump-if-!=  $compute-offsets:abort/disp32
<span id="L979" class="LineNr"> 979 </span>    <span class="subxComment"># seg/ebx = get-or-insert(segments, curr-segment-name, row-size=16)</span>
<span id="L980" class="LineNr"> 980 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L981" class="LineNr"> 981 </span>    68/push  0x10/imm32/row-size
<span id="L982" class="LineNr"> 982 </span>    56/push-esi
<span id="L983" class="LineNr"> 983 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+12)</span>
<span id="L984" class="LineNr"> 984 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L985" class="LineNr"> 985 </span>    e8/call  <a href='../081table.subx.html#L404'>get-or-insert</a>/disp32
<span id="L986" class="LineNr"> 986 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L987" class="LineNr"> 987 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L988" class="LineNr"> 988 </span>    <span class="subxS1Comment"># . ebx = eax</span>
<span id="L989" class="LineNr"> 989 </span>    89/copy                         3/mod/direct    3/rm32/ebx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy eax to ebx</span>
<span id="L990" class="LineNr"> 990 </span>    <span class="subxComment"># seg-&gt;address = parse-hex-int(segment-tmp)</span>
<span id="L991" class="LineNr"> 991 </span>    <span class="subxS1Comment"># . eax = parse-hex-int(segment-tmp)</span>
<span id="L992" class="LineNr"> 992 </span>    68/push  <a href='survey.subx.html#L621'>compute-offsets</a>:segment-tmp/imm32
<span id="L993" class="LineNr"> 993 </span>    e8/call  <a href='../067parse-hex.subx.html#L354'>parse-hex-int</a>/disp32
<span id="L994" class="LineNr"> 994 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L995" class="LineNr"> 995 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L996" class="LineNr"> 996 </span>    <span class="subxS1Comment"># . seg-&gt;address = eax</span>
<span id="L997" class="LineNr"> 997 </span>    89/copy                         0/mod/indirect  3/rm32/ebx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy eax to *ebx</span>
<span id="L998" class="LineNr"> 998 </span>    <span class="subxComment"># seg-&gt;file-offset = *file-offset</span>
<span id="L999" class="LineNr"> 999 </span>    8b/copy                         0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   <a href='survey.subx.html#L621'>compute-offsets</a>:file-offset/disp32 <span class="subxComment"># copy *file-offset to eax</span>
<span id="L1000" class="LineNr">1000 </span>    89/copy                         1/mod/*+disp8   3/rm32/ebx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy eax to *(ebx+4)</span>
<span id="L1001" class="LineNr">1001 </span>    <span class="subxComment"># trace-sssns(&quot;segment '&quot;, curr-segment-name, &quot;' is at file offset &quot;, seg-&gt;file-offset, &quot;&quot;)</span>
<span id="L1002" class="LineNr">1002 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1003" class="LineNr">1003 </span>    68/push  <span class="Constant">&quot;.&quot;</span>/imm32
<span id="L1004" class="LineNr">1004 </span>    50/push-eax
<span id="L1005" class="LineNr">1005 </span>    68/push  <span class="Constant">&quot;' is at file offset &quot;</span>/imm32
<span id="L1006" class="LineNr">1006 </span>    56/push-esi
<span id="L1007" class="LineNr">1007 </span>    68/push  <span class="Constant">&quot;segment '&quot;</span>/imm32
<span id="L1008" class="LineNr">1008 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1009" class="LineNr">1009 </span>    e8/call  <a href='survey.subx.html#L3557'>trace-sssns</a>/disp32
<span id="L1010" class="LineNr">1010 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1011" class="LineNr">1011 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x14/imm32        <span class="subxComment"># add to esp</span>
<span id="L1012" class="LineNr">1012 </span>    <span class="subxComment"># segment-offset = 0</span>
<span id="L1013" class="LineNr">1013 </span>    c7          0/subop/copy        0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>    <a href='survey.subx.html#L621'>compute-offsets</a>:segment-offset/disp32  0/imm32           <span class="subxComment"># copy to *segment-offset</span>
<span id="L1014" class="LineNr">1014 </span>    <span class="subxComment"># break</span>
<span id="L1015" class="LineNr">1015 </span>    e9/jump $compute-offsets:line-loop/disp32
<span id="L1016" class="LineNr">1016 </span><span class="Constant">$compute-offsets:case-label</span>:
<span id="L1017" class="LineNr">1017 </span>    <span class="subxComment"># if (!is-label?(word-slice/edx)) goto next case</span>
<span id="L1018" class="LineNr">1018 </span>    <span class="subxS1Comment"># . eax = is-label?(word-slice/edx)</span>
<span id="L1019" class="LineNr">1019 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1020" class="LineNr">1020 </span>    52/push-edx
<span id="L1021" class="LineNr">1021 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1022" class="LineNr">1022 </span>    e8/call  <a href='../077subx-words.subx.html#L535'>is-label?</a>/disp32
<span id="L1023" class="LineNr">1023 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1024" class="LineNr">1024 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L1025" class="LineNr">1025 </span>    <span class="subxS1Comment"># . if (eax == false) goto next case</span>
<span id="L1026" class="LineNr">1026 </span>    3d/compare-eax-and  0/imm32/false
<span id="L1027" class="LineNr">1027 </span>    74/jump-if-=  $compute-offsets:case-default/disp8
<span id="L1028" class="LineNr">1028 </span>    <span class="subxComment"># strip trailing ':' from word-slice</span>
<span id="L1029" class="LineNr">1029 </span>    ff          1/subop/decrement   1/mod/*+disp8   2/rm32/edx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># decrement *(edx+4)</span>
<span id="L1030" class="LineNr">1030 </span>    <span class="subxComment"># x/eax = leaky-get-or-insert-slice(labels, word-slice, row-size=16)</span>
<span id="L1031" class="LineNr">1031 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1032" class="LineNr">1032 </span>    68/push  0x10/imm32/row-size
<span id="L1033" class="LineNr">1033 </span>    52/push-edx
<span id="L1034" class="LineNr">1034 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0x10/disp8     <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+16)</span>
<span id="L1035" class="LineNr">1035 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1036" class="LineNr">1036 </span>    e8/call  <a href='../081table.subx.html#L655'>leaky-get-or-insert-slice</a>/disp32
<span id="L1037" class="LineNr">1037 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1038" class="LineNr">1038 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L1039" class="LineNr">1039 </span><span class="Constant">$compute-offsets:save-label-offset</span>:
<span id="L1040" class="LineNr">1040 </span>    <span class="subxComment"># x-&gt;segment-name = curr-segment-name</span>
<span id="L1041" class="LineNr">1041 </span>    89/copy                         0/mod/indirect  0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          6/r32/esi  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esi to *eax</span>
<span id="L1042" class="LineNr">1042 </span>    <span class="subxComment"># trace-slsss(&quot;label '&quot; word-slice/edx &quot;' is in segment '&quot; current-segment-name &quot;'.&quot;)</span>
<span id="L1043" class="LineNr">1043 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1044" class="LineNr">1044 </span>    68/push  <span class="Constant">&quot;'.&quot;</span>/imm32
<span id="L1045" class="LineNr">1045 </span>    56/push-esi
<span id="L1046" class="LineNr">1046 </span>    68/push  <span class="Constant">&quot;' is in segment '&quot;</span>/imm32
<span id="L1047" class="LineNr">1047 </span>    52/push-edx
<span id="L1048" class="LineNr">1048 </span>    68/push  <span class="Constant">&quot;label '&quot;</span>/imm32
<span id="L1049" class="LineNr">1049 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1050" class="LineNr">1050 </span>    e8/call  <a href='survey.subx.html#L4012'>trace-slsss</a>/disp32
<span id="L1051" class="LineNr">1051 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1052" class="LineNr">1052 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x14/imm32        <span class="subxComment"># add to esp</span>
<span id="L1053" class="LineNr">1053 </span>    <span class="subxComment"># x-&gt;segment-offset = segment-offset</span>
<span id="L1054" class="LineNr">1054 </span>    <span class="subxS1Comment"># . ebx = segment-offset</span>
<span id="L1055" class="LineNr">1055 </span>    8b/copy                         0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>          3/r32/ebx   <a href='survey.subx.html#L621'>compute-offsets</a>:segment-offset/disp32  <span class="subxComment"># copy *segment-offset to ebx</span>
<span id="L1056" class="LineNr">1056 </span>    <span class="subxS1Comment"># . x-&gt;segment-offset = ebx</span>
<span id="L1057" class="LineNr">1057 </span>    89/copy                         1/mod/*+disp8   0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          3/r32/ebx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy ebx to *(eax+4)</span>
<span id="L1058" class="LineNr">1058 </span>    <span class="subxComment"># trace-slsns(&quot;label '&quot; word-slice/edx &quot;' is at segment offset &quot; *segment-offset/eax &quot;.&quot;)</span>
<span id="L1059" class="LineNr">1059 </span>    <span class="subxS2Comment"># . . eax = file-offset</span>
<span id="L1060" class="LineNr">1060 </span>    b8/copy-to-eax <a href='survey.subx.html#L621'>compute-offsets</a>:segment-offset/imm32
<span id="L1061" class="LineNr">1061 </span>    <span class="subxS2Comment"># . . eax = *file-offset/eax</span>
<span id="L1062" class="LineNr">1062 </span>    8b/copy                         0/mod/indirect  0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *eax to eax</span>
<span id="L1063" class="LineNr">1063 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1064" class="LineNr">1064 </span>    68/push  <span class="Constant">&quot;.&quot;</span>/imm32
<span id="L1065" class="LineNr">1065 </span>    50/push-eax
<span id="L1066" class="LineNr">1066 </span>    68/push  <span class="Constant">&quot;' is at segment offset &quot;</span>/imm32
<span id="L1067" class="LineNr">1067 </span>    52/push-edx
<span id="L1068" class="LineNr">1068 </span>    68/push  <span class="Constant">&quot;label '&quot;</span>/imm32
<span id="L1069" class="LineNr">1069 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1070" class="LineNr">1070 </span>    e8/call  <a href='survey.subx.html#L3896'>trace-slsns</a>/disp32
<span id="L1071" class="LineNr">1071 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1072" class="LineNr">1072 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x14/imm32        <span class="subxComment"># add to esp</span>
<span id="L1073" class="LineNr">1073 </span>    <span class="subxComment"># continue</span>
<span id="L1074" class="LineNr">1074 </span>    e9/jump  $compute-offsets:word-loop/disp32
<span id="L1075" class="LineNr">1075 </span><span class="Constant">$compute-offsets:case-default</span>:
<span id="L1076" class="LineNr">1076 </span>    <span class="subxComment"># width/eax = compute-width-of-slice(word-slice)</span>
<span id="L1077" class="LineNr">1077 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1078" class="LineNr">1078 </span>    52/push-edx
<span id="L1079" class="LineNr">1079 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1080" class="LineNr">1080 </span>    e8/call <a href='../083subx-widths.subx.html#L45'>compute-width-of-slice</a>/disp32
<span id="L1081" class="LineNr">1081 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1082" class="LineNr">1082 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L1083" class="LineNr">1083 </span>    <span class="subxComment"># segment-offset += width</span>
<span id="L1084" class="LineNr">1084 </span>    01/add                          0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   <a href='survey.subx.html#L621'>compute-offsets</a>:segment-offset/disp32 <span class="subxComment"># add eax to *segment-offset</span>
<span id="L1085" class="LineNr">1085 </span>    <span class="subxComment"># file-offset += width</span>
<span id="L1086" class="LineNr">1086 </span>    01/add                          0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   <a href='survey.subx.html#L621'>compute-offsets</a>:file-offset/disp32 <span class="subxComment"># add eax to *file-offset</span>
<span id="L1087" class="Folded">1087 </span><span class="Folded">+-- 41 lines: #?     # dump segment-offset -------------------------------------------------------------------------------------------------------------------</span>
<span id="L1128" class="LineNr">1128 </span>    e9/jump $compute-offsets:word-loop/disp32
<span id="L1129" class="LineNr">1129 </span><span class="Constant">$compute-offsets:break-line-loop</span>:
<span id="L1130" class="LineNr">1130 </span>    <span class="subxComment"># seg/eax = get-or-insert(segments, curr-segment-name, row-size=16)</span>
<span id="L1131" class="LineNr">1131 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1132" class="LineNr">1132 </span>    68/push  0x10/imm32/row-size
<span id="L1133" class="LineNr">1133 </span>    56/push-esi
<span id="L1134" class="LineNr">1134 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+12)</span>
<span id="L1135" class="LineNr">1135 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1136" class="LineNr">1136 </span>    e8/call  <a href='../081table.subx.html#L404'>get-or-insert</a>/disp32
<span id="L1137" class="LineNr">1137 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1138" class="LineNr">1138 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L1139" class="LineNr">1139 </span>    <span class="subxComment"># seg-&gt;size = file-offset - seg-&gt;file-offset</span>
<span id="L1140" class="LineNr">1140 </span>    <span class="subxS1Comment"># . save ecx</span>
<span id="L1141" class="LineNr">1141 </span>    51/push-ecx
<span id="L1142" class="LineNr">1142 </span>    <span class="subxS1Comment"># . ebx = *file-offset</span>
<span id="L1143" class="LineNr">1143 </span>    8b/copy                         0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>          3/r32/ebx   <a href='survey.subx.html#L621'>compute-offsets</a>:file-offset/disp32 <span class="subxComment"># copy *file-offset to ebx</span>
<span id="L1144" class="LineNr">1144 </span>    <span class="subxS1Comment"># . ecx = seg-&gt;file-offset</span>
<span id="L1145" class="LineNr">1145 </span>    8b/copy                         1/mod/*+disp8   0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(eax+4) to ecx</span>
<span id="L1146" class="LineNr">1146 </span>    <span class="subxS1Comment"># . ebx -= ecx</span>
<span id="L1147" class="LineNr">1147 </span>    29/subtract                     3/mod/direct    3/rm32/ebx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># subtract ecx from ebx</span>
<span id="L1148" class="LineNr">1148 </span>    <span class="subxS1Comment"># . seg-&gt;size = ebx</span>
<span id="L1149" class="LineNr">1149 </span>    89/copy                         1/mod/*+disp8   0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          3/r32/ebx   8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy ebx to *(eax+8)</span>
<span id="L1150" class="LineNr">1150 </span>    <span class="subxS1Comment"># . restore ecx</span>
<span id="L1151" class="LineNr">1151 </span>    59/pop-to-ecx
<span id="L1152" class="LineNr">1152 </span>    <span class="subxComment"># trace-sssns(&quot;segment '&quot;, curr-segment-name, &quot;' has size &quot;, seg-&gt;size, &quot;.&quot;)</span>
<span id="L1153" class="LineNr">1153 </span>    <span class="subxS1Comment"># . trace-sssns(&quot;segment '&quot;, curr-segment-name, &quot;' has size &quot;, ebx, &quot;.&quot;)</span>
<span id="L1154" class="LineNr">1154 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1155" class="LineNr">1155 </span>    68/push  <span class="Constant">&quot;.&quot;</span>/imm32
<span id="L1156" class="LineNr">1156 </span>    53/push-ebx
<span id="L1157" class="LineNr">1157 </span>    68/push  <span class="Constant">&quot;' has size &quot;</span>/imm32
<span id="L1158" class="LineNr">1158 </span>    56/push-esi
<span id="L1159" class="LineNr">1159 </span>    68/push  <span class="Constant">&quot;segment '&quot;</span>/imm32
<span id="L1160" class="LineNr">1160 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1161" class="LineNr">1161 </span>    e8/call  <a href='survey.subx.html#L3557'>trace-sssns</a>/disp32
<span id="L1162" class="LineNr">1162 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1163" class="LineNr">1163 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x14/imm32        <span class="subxComment"># add to esp</span>
<span id="L1164" class="LineNr">1164 </span><span class="Constant">$compute-offsets:end</span>:
<span id="L1165" class="LineNr">1165 </span>    <span class="subxS1Comment"># . reclaim locals</span>
<span id="L1166" class="LineNr">1166 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x20c/imm32       <span class="subxComment"># add to esp</span>
<span id="L1167" class="LineNr">1167 </span>    <span class="subxS1Comment"># . restore registers</span>
<span id="L1168" class="LineNr">1168 </span>    5f/pop-to-edi
<span id="L1169" class="LineNr">1169 </span>    5e/pop-to-esi
<span id="L1170" class="LineNr">1170 </span>    5b/pop-to-ebx
<span id="L1171" class="LineNr">1171 </span>    5a/pop-to-edx
<span id="L1172" class="LineNr">1172 </span>    59/pop-to-ecx
<span id="L1173" class="LineNr">1173 </span>    58/pop-to-eax
<span id="L1174" class="LineNr">1174 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L1175" class="LineNr">1175 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L1176" class="LineNr">1176 </span>    5d/pop-to-ebp
<span id="L1177" class="LineNr">1177 </span>    c3/return
<span id="L1178" class="LineNr">1178 </span>
<span id="L1179" class="LineNr">1179 </span><span class="Constant">$compute-offsets:abort</span>:
<span id="L1180" class="LineNr">1180 </span>    <span class="subxS1Comment"># . _write(2/stderr, error)</span>
<span id="L1181" class="LineNr">1181 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1182" class="LineNr">1182 </span>    68/push  <span class="Constant">&quot;'==' must be followed by segment name and segment-start\n&quot;</span>/imm32
<span id="L1183" class="LineNr">1183 </span>    68/push  2/imm32/stderr
<span id="L1184" class="LineNr">1184 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1185" class="LineNr">1185 </span>    e8/call  <a href='../050_write.subx.html#L14'>_write</a>/disp32
<span id="L1186" class="LineNr">1186 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1187" class="LineNr">1187 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L1188" class="LineNr">1188 </span>    <span class="subxS1Comment"># . syscall(exit, 1)</span>
<span id="L1189" class="LineNr">1189 </span>    bb/copy-to-ebx  1/imm32
<span id="L1190" class="LineNr">1190 </span>    b8/copy-to-eax  1/imm32/exit
<span id="L1191" class="LineNr">1191 </span>    cd/syscall  0x80/imm8
<span id="L1192" class="LineNr">1192 </span>    <span class="subxComment"># never gets here</span>
<span id="L1193" class="LineNr">1193 </span>
<span id="L1194" class="LineNr">1194 </span><span class="subxTest">test-compute-offsets</span>:
<span id="L1195" class="LineNr">1195 </span>    <span class="subxComment"># input:</span>
<span id="L1196" class="LineNr">1196 </span>    <span class="subxComment">#   == code 0x1</span>
<span id="L1197" class="LineNr">1197 </span>    <span class="subxComment">#   ab x/imm32  # skip comment</span>
<span id="L1198" class="LineNr">1198 </span>    <span class="subxComment">#   == data 0x1000</span>
<span id="L1199" class="LineNr">1199 </span>    <span class="subxComment">#   00</span>
<span id="L1200" class="LineNr">1200 </span>    <span class="subxComment">#   x:</span>
<span id="L1201" class="LineNr">1201 </span>    <span class="subxComment">#     34</span>
<span id="L1202" class="LineNr">1202 </span>    <span class="subxComment">#</span>
<span id="L1203" class="LineNr">1203 </span>    <span class="subxComment"># trace contains (in any order):</span>
<span id="L1204" class="LineNr">1204 </span>    <span class="subxComment">#   segment 'code' is at file offset 0x0.</span>
<span id="L1205" class="LineNr">1205 </span>    <span class="subxComment">#   segment 'code' has size 0x5.</span>
<span id="L1206" class="LineNr">1206 </span>    <span class="subxComment">#   segment 'data' is at file offset 0x5.</span>
<span id="L1207" class="LineNr">1207 </span>    <span class="subxComment">#   segment 'data' has size 0x2.</span>
<span id="L1208" class="LineNr">1208 </span>    <span class="subxComment">#   label 'x' is in segment 'data'.</span>
<span id="L1209" class="LineNr">1209 </span>    <span class="subxComment">#   label 'x' is at segment offset 0x1.</span>
<span id="L1210" class="LineNr">1210 </span>    <span class="subxComment">#</span>
<span id="L1211" class="LineNr">1211 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L1212" class="LineNr">1212 </span>    55/push-ebp
<span id="L1213" class="LineNr">1213 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L1214" class="LineNr">1214 </span>    <span class="subxComment"># setup</span>
<span id="L1215" class="LineNr">1215 </span>    <span class="subxS1Comment"># . clear-stream(_test-input-stream)</span>
<span id="L1216" class="LineNr">1216 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1217" class="LineNr">1217 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L1218" class="LineNr">1218 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1219" class="LineNr">1219 </span>    e8/call  <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L1220" class="LineNr">1220 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1221" class="LineNr">1221 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L1222" class="LineNr">1222 </span>    <span class="subxComment"># var segments/ecx : (stream byte 2*16)</span>
<span id="L1223" class="LineNr">1223 </span>    81          5/subop/subtract    3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x20/imm32        <span class="subxComment"># subtract from esp</span>
<span id="L1224" class="LineNr">1224 </span>    68/push  0x20/imm32/length
<span id="L1225" class="LineNr">1225 </span>    68/push  0/imm32/read
<span id="L1226" class="LineNr">1226 </span>    68/push  0/imm32/write
<span id="L1227" class="LineNr">1227 </span>    89/copy                         3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ecx</span>
<span id="L1228" class="LineNr">1228 </span>    <span class="subxComment"># var labels/edx : (stream byte 2*16)</span>
<span id="L1229" class="LineNr">1229 </span>    81          5/subop/subtract    3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x20/imm32        <span class="subxComment"># subtract from esp</span>
<span id="L1230" class="LineNr">1230 </span>    68/push  0x20/imm32/length
<span id="L1231" class="LineNr">1231 </span>    68/push  0/imm32/read
<span id="L1232" class="LineNr">1232 </span>    68/push  0/imm32/write
<span id="L1233" class="LineNr">1233 </span>    89/copy                         3/mod/direct    2/rm32/edx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to edx</span>
<span id="L1234" class="LineNr">1234 </span>    <span class="subxComment"># initialize input</span>
<span id="L1235" class="LineNr">1235 </span>    <span class="subxS1Comment"># . write(_test-input-stream, &quot;== code 0x1\n&quot;)</span>
<span id="L1236" class="LineNr">1236 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1237" class="LineNr">1237 </span>    68/push  <span class="Constant">&quot;== code 0x1\n&quot;</span>/imm32
<span id="L1238" class="LineNr">1238 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L1239" class="LineNr">1239 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1240" class="LineNr">1240 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L1241" class="LineNr">1241 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1242" class="LineNr">1242 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L1243" class="LineNr">1243 </span>    <span class="subxS1Comment"># . write(_test-input-stream, &quot;ab x/imm32  # skip comment\n&quot;)</span>
<span id="L1244" class="LineNr">1244 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1245" class="LineNr">1245 </span>    68/push  <span class="Constant">&quot;ab x/imm32  # skip comment\n&quot;</span>/imm32
<span id="L1246" class="LineNr">1246 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L1247" class="LineNr">1247 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1248" class="LineNr">1248 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L1249" class="LineNr">1249 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1250" class="LineNr">1250 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L1251" class="LineNr">1251 </span>    <span class="subxS1Comment"># . write(_test-input-stream, &quot;== data 0x1000\n&quot;)</span>
<span id="L1252" class="LineNr">1252 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1253" class="LineNr">1253 </span>    68/push  <span class="Constant">&quot;== data 0x1000\n&quot;</span>/imm32
<span id="L1254" class="LineNr">1254 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L1255" class="LineNr">1255 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1256" class="LineNr">1256 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L1257" class="LineNr">1257 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1258" class="LineNr">1258 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L1259" class="LineNr">1259 </span>    <span class="subxS1Comment"># . write(_test-input-stream, &quot;00\n&quot;)</span>
<span id="L1260" class="LineNr">1260 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1261" class="LineNr">1261 </span>    68/push  <span class="Constant">&quot;00\n&quot;</span>/imm32
<span id="L1262" class="LineNr">1262 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L1263" class="LineNr">1263 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1264" class="LineNr">1264 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L1265" class="LineNr">1265 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1266" class="LineNr">1266 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L1267" class="LineNr">1267 </span>    <span class="subxS1Comment"># . write(_test-input-stream, &quot;x:\n&quot;)</span>
<span id="L1268" class="LineNr">1268 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1269" class="LineNr">1269 </span>    68/push  <span class="Constant">&quot;x:\n&quot;</span>/imm32
<span id="L1270" class="LineNr">1270 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L1271" class="LineNr">1271 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1272" class="LineNr">1272 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L1273" class="LineNr">1273 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1274" class="LineNr">1274 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L1275" class="LineNr">1275 </span>    <span class="subxS1Comment"># . write(_test-input-stream, &quot;34\n&quot;)</span>
<span id="L1276" class="LineNr">1276 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1277" class="LineNr">1277 </span>    68/push  <span class="Constant">&quot;34\n&quot;</span>/imm32
<span id="L1278" class="LineNr">1278 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L1279" class="LineNr">1279 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1280" class="LineNr">1280 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L1281" class="LineNr">1281 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1282" class="LineNr">1282 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L1283" class="LineNr">1283 </span>    <span class="subxComment"># compute-offsets(_test-input-stream, segments, labels)</span>
<span id="L1284" class="LineNr">1284 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1285" class="LineNr">1285 </span>    52/push-edx
<span id="L1286" class="LineNr">1286 </span>    51/push-ecx
<span id="L1287" class="LineNr">1287 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L1288" class="LineNr">1288 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1289" class="LineNr">1289 </span>    e8/call  <a href='survey.subx.html#L621'>compute-offsets</a>/disp32
<span id="L1290" class="LineNr">1290 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1291" class="LineNr">1291 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32        <span class="subxComment"># add to esp</span>
<span id="L1292" class="Folded">1292 </span><span class="Folded">+-- 26 lines: #?     # dump *Trace-stream --------------------------------------------------------------------------------------------------------------------</span>
<span id="L1318" class="LineNr">1318 </span>    <span class="subxComment"># check trace</span>
<span id="L1319" class="LineNr">1319 </span>    <span class="subxS1Comment"># . check-trace-contains(&quot;segment 'code' is at file offset 0x00000000.&quot;, msg)</span>
<span id="L1320" class="LineNr">1320 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1321" class="LineNr">1321 </span>    68/push  <span class="Constant">&quot;F - <a href='survey.subx.html#L1194'>test-compute-offsets</a>/0&quot;</span>/imm32
<span id="L1322" class="LineNr">1322 </span>    68/push  <span class="Constant">&quot;segment 'code' is at file offset 0x00000000.&quot;</span>/imm32
<span id="L1323" class="LineNr">1323 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1324" class="LineNr">1324 </span>    e8/call  <a href='../056trace.subx.html#L253'>check-trace-contains</a>/disp32
<span id="L1325" class="LineNr">1325 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1326" class="LineNr">1326 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L1327" class="LineNr">1327 </span>    <span class="subxS1Comment"># . check-trace-contains(&quot;segment 'code' has size 0x00000005&quot;, msg)</span>
<span id="L1328" class="LineNr">1328 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1329" class="LineNr">1329 </span>    68/push  <span class="Constant">&quot;F - <a href='survey.subx.html#L1194'>test-compute-offsets</a>/1&quot;</span>/imm32
<span id="L1330" class="LineNr">1330 </span>    68/push  <span class="Constant">&quot;segment 'code' has size 0x00000005.&quot;</span>/imm32
<span id="L1331" class="LineNr">1331 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1332" class="LineNr">1332 </span>    e8/call  <a href='../056trace.subx.html#L253'>check-trace-contains</a>/disp32
<span id="L1333" class="LineNr">1333 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1334" class="LineNr">1334 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L1335" class="LineNr">1335 </span>    <span class="subxS1Comment"># . check-trace-contains(&quot;segment 'data' is at file offset 0x00000005.&quot;, msg)</span>
<span id="L1336" class="LineNr">1336 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1337" class="LineNr">1337 </span>    68/push  <span class="Constant">&quot;F - <a href='survey.subx.html#L1194'>test-compute-offsets</a>/2&quot;</span>/imm32
<span id="L1338" class="LineNr">1338 </span>    68/push  <span class="Constant">&quot;segment 'data' is at file offset 0x00000005.&quot;</span>/imm32
<span id="L1339" class="LineNr">1339 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1340" class="LineNr">1340 </span>    e8/call  <a href='../056trace.subx.html#L253'>check-trace-contains</a>/disp32
<span id="L1341" class="LineNr">1341 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1342" class="LineNr">1342 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L1343" class="LineNr">1343 </span>    <span class="subxS1Comment"># . check-trace-contains(&quot;segment 'data' has size 0x00000002.&quot;, msg)</span>
<span id="L1344" class="LineNr">1344 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1345" class="LineNr">1345 </span>    68/push  <span class="Constant">&quot;F - <a href='survey.subx.html#L1194'>test-compute-offsets</a>/3&quot;</span>/imm32
<span id="L1346" class="LineNr">1346 </span>    68/push  <span class="Constant">&quot;segment 'data' has size 0x00000002.&quot;</span>/imm32
<span id="L1347" class="LineNr">1347 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1348" class="LineNr">1348 </span>    e8/call  <a href='../056trace.subx.html#L253'>check-trace-contains</a>/disp32
<span id="L1349" class="LineNr">1349 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1350" class="LineNr">1350 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L1351" class="LineNr">1351 </span>    <span class="subxS1Comment"># . check-trace-contains(&quot;label 'x' is in segment 'data'.&quot;, msg)</span>
<span id="L1352" class="LineNr">1352 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1353" class="LineNr">1353 </span>    68/push  <span class="Constant">&quot;F - <a href='survey.subx.html#L1194'>test-compute-offsets</a>/4&quot;</span>/imm32
<span id="L1354" class="LineNr">1354 </span>    68/push  <span class="Constant">&quot;label 'x' is in segment 'data'.&quot;</span>/imm32
<span id="L1355" class="LineNr">1355 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1356" class="LineNr">1356 </span>    e8/call  <a href='../056trace.subx.html#L253'>check-trace-contains</a>/disp32
<span id="L1357" class="LineNr">1357 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1358" class="LineNr">1358 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L1359" class="LineNr">1359 </span>    <span class="subxS1Comment"># . check-trace-contains(&quot;label 'x' is at segment offset 0x00000001.&quot;, msg)</span>
<span id="L1360" class="LineNr">1360 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1361" class="LineNr">1361 </span>    68/push  <span class="Constant">&quot;F - <a href='survey.subx.html#L1194'>test-compute-offsets</a>/5&quot;</span>/imm32
<span id="L1362" class="LineNr">1362 </span>    68/push  <span class="Constant">&quot;label 'x' is at segment offset 0x00000001.&quot;</span>/imm32
<span id="L1363" class="LineNr">1363 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1364" class="LineNr">1364 </span>    e8/call  <a href='../056trace.subx.html#L253'>check-trace-contains</a>/disp32
<span id="L1365" class="LineNr">1365 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1366" class="LineNr">1366 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L1367" class="LineNr">1367 </span>    <span class="subxS1Comment"># . check-ints-equal(labels-&gt;write, 0x10, msg)</span>
<span id="L1368" class="LineNr">1368 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1369" class="LineNr">1369 </span>    68/push  <span class="Constant">&quot;F - test-compute-offsets-maintains-labels-write-index&quot;</span>/imm32
<span id="L1370" class="LineNr">1370 </span>    68/push  0x10/imm32/1-entry
<span id="L1371" class="LineNr">1371 </span>    ff          6/subop/push        0/mod/indirect  2/rm32/edx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># push *edx</span>
<span id="L1372" class="LineNr">1372 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1373" class="LineNr">1373 </span>    e8/call  <a href='../051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L1374" class="LineNr">1374 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1375" class="LineNr">1375 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L1376" class="LineNr">1376 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L1377" class="LineNr">1377 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L1378" class="LineNr">1378 </span>    5d/pop-to-ebp
<span id="L1379" class="LineNr">1379 </span>    c3/return
<span id="L1380" class="LineNr">1380 </span>
<span id="L1381" class="LineNr">1381 </span><span class="subxFunction">compute-addresses</span>:  <span class="subxComment"># segments : (addr stream {string, segment-info}), labels : (addr stream {string, label-info})</span>
<span id="L1382" class="LineNr">1382 </span>    <span class="subxComment"># pseudocode:</span>
<span id="L1383" class="LineNr">1383 </span>    <span class="subxComment">#   srow : (addr segment-info) = segments-&gt;data</span>
<span id="L1384" class="LineNr">1384 </span>    <span class="subxComment">#   max = &amp;segments-&gt;data[segments-&gt;write]</span>
<span id="L1385" class="LineNr">1385 </span>    <span class="subxComment">#   num-segments = segments-&gt;write / 16</span>
<span id="L1386" class="LineNr">1386 </span>    <span class="subxComment">#   starting-offset = 0x34 + (num-segments * 0x20)</span>
<span id="L1387" class="LineNr">1387 </span>    <span class="subxComment">#   while true</span>
<span id="L1388" class="LineNr">1388 </span>    <span class="subxComment">#     if (srow &gt;= max) break</span>
<span id="L1389" class="LineNr">1389 </span>    <span class="subxComment">#     s-&gt;file-offset += starting-offset</span>
<span id="L1390" class="LineNr">1390 </span>    <span class="subxComment">#     s-&gt;address &amp;= 0xfffff000  # clear last 12 bits for p_align</span>
<span id="L1391" class="LineNr">1391 </span>    <span class="subxComment">#     s-&gt;address += (s-&gt;file-offset &amp; 0x00000fff)</span>
<span id="L1392" class="LineNr">1392 </span>    <span class="subxComment">#     trace-sssns(&quot;segment &quot; s-&gt;key &quot; starts at address &quot; s-&gt;address)</span>
<span id="L1393" class="LineNr">1393 </span>    <span class="subxComment">#     srow += 16  # row-size</span>
<span id="L1394" class="LineNr">1394 </span>    <span class="subxComment">#   lrow : (addr label-info) = labels-&gt;data</span>
<span id="L1395" class="LineNr">1395 </span>    <span class="subxComment">#   max = &amp;labels-&gt;data[labels-&gt;write]</span>
<span id="L1396" class="LineNr">1396 </span>    <span class="subxComment">#   while true</span>
<span id="L1397" class="LineNr">1397 </span>    <span class="subxComment">#     if (lrow &gt;= max) break</span>
<span id="L1398" class="LineNr">1398 </span>    <span class="subxComment">#     seg-name : (addr string) = lrow-&gt;segment-name</span>
<span id="L1399" class="LineNr">1399 </span>    <span class="subxComment">#     label-seg : (addr segment-info) = get(segments, seg-name)</span>
<span id="L1400" class="LineNr">1400 </span>    <span class="subxComment">#     lrow-&gt;address = label-seg-&gt;address + lrow-&gt;segment-offset</span>
<span id="L1401" class="LineNr">1401 </span>    <span class="subxComment">#     trace-sssns(&quot;label &quot; lrow-&gt;key &quot; is at address &quot; lrow-&gt;address)</span>
<span id="L1402" class="LineNr">1402 </span>    <span class="subxComment">#     lrow += 16  # row-size</span>
<span id="L1403" class="LineNr">1403 </span>    <span class="subxComment">#</span>
<span id="L1404" class="LineNr">1404 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L1405" class="LineNr">1405 </span>    55/push-ebp
<span id="L1406" class="LineNr">1406 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L1407" class="LineNr">1407 </span>    <span class="subxS1Comment"># . save registers</span>
<span id="L1408" class="LineNr">1408 </span>    50/push-eax
<span id="L1409" class="LineNr">1409 </span>    51/push-ecx
<span id="L1410" class="LineNr">1410 </span>    52/push-edx
<span id="L1411" class="LineNr">1411 </span>    53/push-ebx
<span id="L1412" class="LineNr">1412 </span>    56/push-esi
<span id="L1413" class="LineNr">1413 </span>    57/push-edi
<span id="L1414" class="LineNr">1414 </span>    <span class="subxComment"># esi = segments</span>
<span id="L1415" class="LineNr">1415 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          6/r32/esi   8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+8) to esi</span>
<span id="L1416" class="LineNr">1416 </span>    <span class="subxComment"># starting-offset/edi = 0x34 + (num-segments * 0x20)  # make room for ELF headers</span>
<span id="L1417" class="LineNr">1417 </span>    <span class="subxS1Comment"># . edi = segments-&gt;write / 16 (row-size)</span>
<span id="L1418" class="LineNr">1418 </span>    8b/copy                         0/mod/indirect  6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          7/r32/edi  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *esi to edi</span>
<span id="L1419" class="LineNr">1419 </span>    c1/shift    5/subop/logic-right 3/mod/direct    7/rm32/edi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm8            <span class="subxComment"># shift edi right by 4 bits, while padding zeroes</span>
<span id="L1420" class="LineNr">1420 </span>    <span class="subxS1Comment"># . edi = (edi * 0x20) + 0x34</span>
<span id="L1421" class="LineNr">1421 </span>    c1/shift    4/subop/left        3/mod/direct    7/rm32/edi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              5/imm8            <span class="subxComment"># shift edi left by 5 bits</span>
<span id="L1422" class="LineNr">1422 </span>    81          0/subop/add         3/mod/direct    7/rm32/edi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x34/imm32        <span class="subxComment"># add to edi</span>
<span id="L1423" class="LineNr">1423 </span>    <span class="subxComment"># srow/eax = segments-&gt;data</span>
<span id="L1424" class="LineNr">1424 </span>    8d/copy-address                 1/mod/*+disp8   6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy esi+12 to eax</span>
<span id="L1425" class="LineNr">1425 </span>    <span class="subxComment"># max/ecx = &amp;segments-&gt;data[segments-&gt;write]</span>
<span id="L1426" class="LineNr">1426 </span>    8b/copy                         0/mod/indirect  6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *esi to ecx</span>
<span id="L1427" class="LineNr">1427 </span>    01/add                          3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          6/r32/esi  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># add esi to ecx</span>
<span id="L1428" class="LineNr">1428 </span><span class="Constant">$compute-addresses:segment-loop</span>:
<span id="L1429" class="LineNr">1429 </span>    <span class="subxComment"># if (srow &gt;= max) break</span>
<span id="L1430" class="LineNr">1430 </span>    39/compare                      3/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># compare eax with ecx</span>
<span id="L1431" class="LineNr">1431 </span>    73/jump-if-addr&gt;=  $compute-addresses:segment-break/disp8
<span id="L1432" class="LineNr">1432 </span>    <span class="subxComment"># srow-&gt;file-offset += starting-offset</span>
<span id="L1433" class="LineNr">1433 </span>    01/add                          1/mod/*+disp8   0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          7/r32/edi   8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># add edi to *(eax+8)</span>
<span id="L1434" class="LineNr">1434 </span>    <span class="subxComment"># clear last 12 bits of srow-&gt;address for p_align=0x1000</span>
<span id="L1435" class="LineNr">1435 </span>    <span class="subxS1Comment"># . edx = srow-&gt;address</span>
<span id="L1436" class="LineNr">1436 </span>    8b/copy                         1/mod/*+disp8   0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          2/r32/edx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(eax+4) to edx</span>
<span id="L1437" class="LineNr">1437 </span>    <span class="subxS1Comment"># . edx &amp;= 0xfffff000</span>
<span id="L1438" class="LineNr">1438 </span>    81          4/subop/and         3/mod/direct    2/rm32/edx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xfffff000/imm32  <span class="subxComment"># bitwise and of edx</span>
<span id="L1439" class="LineNr">1439 </span>    <span class="subxComment"># update last 12 bits from srow-&gt;file-offset</span>
<span id="L1440" class="LineNr">1440 </span>    <span class="subxS1Comment"># . ebx = srow-&gt;file-offset</span>
<span id="L1441" class="LineNr">1441 </span>    8b/copy                         1/mod/*+disp8   0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          3/r32/ebx   8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(eax+8) to ebx</span>
<span id="L1442" class="LineNr">1442 </span>    <span class="subxS1Comment"># . ebx &amp;= 0xfff</span>
<span id="L1443" class="LineNr">1443 </span>    81          4/subop/and         3/mod/direct    3/rm32/ebx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x00000fff/imm32  <span class="subxComment"># bitwise and of ebx</span>
<span id="L1444" class="LineNr">1444 </span>    <span class="subxS1Comment"># . srow-&gt;address = edx | ebx</span>
<span id="L1445" class="LineNr">1445 </span>    09/or                           3/mod/direct    2/rm32/edx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          3/r32/ebx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># edx = bitwise OR with ebx</span>
<span id="L1446" class="LineNr">1446 </span>    89/copy                         1/mod/*+disp8   0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          2/r32/edx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy edx to *(eax+4)</span>
<span id="L1447" class="LineNr">1447 </span>    <span class="subxComment"># trace-sssns(&quot;segment &quot; srow &quot; starts at address &quot; srow-&gt;address &quot;.&quot;)</span>
<span id="L1448" class="LineNr">1448 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1449" class="LineNr">1449 </span>    68/push  <span class="Constant">&quot;.&quot;</span>/imm32
<span id="L1450" class="LineNr">1450 </span>    52/push-edx
<span id="L1451" class="LineNr">1451 </span>    68/push  <span class="Constant">&quot;' starts at address &quot;</span>/imm32
<span id="L1452" class="LineNr">1452 </span>    ff          6/subop/push        0/mod/indirect  0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># push *eax</span>
<span id="L1453" class="LineNr">1453 </span>    68/push  <span class="Constant">&quot;segment '&quot;</span>/imm32
<span id="L1454" class="LineNr">1454 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1455" class="LineNr">1455 </span>    e8/call  <a href='survey.subx.html#L3557'>trace-sssns</a>/disp32
<span id="L1456" class="LineNr">1456 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1457" class="LineNr">1457 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x14/imm32        <span class="subxComment"># add to esp</span>
<span id="L1458" class="LineNr">1458 </span>    <span class="subxComment"># srow += 16  # size of row</span>
<span id="L1459" class="LineNr">1459 </span>    05/add-to-eax  0x10/imm32
<span id="L1460" class="LineNr">1460 </span>    eb/jump  $compute-addresses:segment-loop/disp8
<span id="L1461" class="LineNr">1461 </span><span class="Constant">$compute-addresses:segment-break</span>:
<span id="L1462" class="Folded">1462 </span><span class="Folded">+-- 26 lines: #?     # dump *Trace-stream --------------------------------------------------------------------------------------------------------------------</span>
<span id="L1488" class="LineNr">1488 </span>    <span class="subxComment"># esi = labels</span>
<span id="L1489" class="LineNr">1489 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          6/r32/esi   0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+12) to esi</span>
<span id="L1490" class="LineNr">1490 </span>    <span class="subxComment"># lrow/eax = labels-&gt;data</span>
<span id="L1491" class="LineNr">1491 </span>    8d/copy-address                 1/mod/*+disp8   6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy esi+12 to eax</span>
<span id="L1492" class="LineNr">1492 </span>    <span class="subxComment"># max/ecx = &amp;labels-&gt;data[labels-&gt;write]</span>
<span id="L1493" class="LineNr">1493 </span>    8b/copy                         0/mod/indirect  6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *esi to ecx</span>
<span id="L1494" class="LineNr">1494 </span>    01/add                          3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          6/r32/esi  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># add esi to ecx</span>
<span id="L1495" class="LineNr">1495 </span><span class="Constant">$compute-addresses:label-loop</span>:
<span id="L1496" class="LineNr">1496 </span>    <span class="subxComment"># if (lrow &gt;= max) break</span>
<span id="L1497" class="LineNr">1497 </span>    39/compare                      3/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># compare eax with ecx</span>
<span id="L1498" class="LineNr">1498 </span>    0f 83/jump-if-addr&gt;=  $compute-addresses:end/disp32
<span id="L1499" class="Folded">1499 </span><span class="Folded">+-- 26 lines: #?     # dump lrow-&gt;key ------------------------------------------------------------------------------------------------------------------------</span>
<span id="L1525" class="LineNr">1525 </span>    <span class="subxComment"># seg-name/edx = lrow-&gt;segment-name</span>
<span id="L1526" class="LineNr">1526 </span>    8b/copy                         1/mod/*+disp8   0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          2/r32/edx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *eax to edx</span>
<span id="L1527" class="Folded">1527 </span><span class="Folded">+-- 26 lines: #?     # dump seg-name -------------------------------------------------------------------------------------------------------------------------</span>
<span id="L1553" class="LineNr">1553 </span>    <span class="subxComment"># label-seg/edx : (addr segment-info) = get(segments, seg-name, row-size=16, &quot;segment table&quot;)</span>
<span id="L1554" class="LineNr">1554 </span>    <span class="subxS1Comment"># . save eax</span>
<span id="L1555" class="LineNr">1555 </span>    50/push-eax
<span id="L1556" class="LineNr">1556 </span>    <span class="subxS1Comment"># . eax = get(segments, seg-name, row-size=16)</span>
<span id="L1557" class="LineNr">1557 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1558" class="LineNr">1558 </span>    68/push  <span class="Constant">&quot;segment table&quot;</span>/imm32
<span id="L1559" class="LineNr">1559 </span>    68/push  0x10/imm32/row-size
<span id="L1560" class="LineNr">1560 </span>    52/push-edx
<span id="L1561" class="LineNr">1561 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+8)</span>
<span id="L1562" class="LineNr">1562 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1563" class="LineNr">1563 </span>    e8/call  <a href='../081table.subx.html#L27'>get</a>/disp32
<span id="L1564" class="LineNr">1564 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1565" class="LineNr">1565 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x10/imm32        <span class="subxComment"># add to esp</span>
<span id="L1566" class="LineNr">1566 </span>    <span class="subxS1Comment"># . edx = eax</span>
<span id="L1567" class="LineNr">1567 </span>    89/copy                         3/mod/direct    2/rm32/edx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy eax to edx</span>
<span id="L1568" class="LineNr">1568 </span>    <span class="subxS1Comment"># . restore eax</span>
<span id="L1569" class="LineNr">1569 </span>    58/pop-to-eax
<span id="L1570" class="LineNr">1570 </span>    <span class="subxComment"># ebx = label-seg-&gt;address</span>
<span id="L1571" class="LineNr">1571 </span>    8b/copy                         0/mod/indirect  2/rm32/edx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          3/r32/ebx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *edx to ebx</span>
<span id="L1572" class="LineNr">1572 </span>    <span class="subxComment"># ebx += lrow-&gt;segment-offset</span>
<span id="L1573" class="LineNr">1573 </span>    03/add                          1/mod/*+disp8   0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          3/r32/ebx   8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># add *(eax+8) to ebx</span>
<span id="L1574" class="LineNr">1574 </span>    <span class="subxComment"># lrow-&gt;address = ebx</span>
<span id="L1575" class="LineNr">1575 </span>    89/copy                         1/mod/*+disp8   0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          3/r32/ebx   0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy ebx to *(eax+12)</span>
<span id="L1576" class="LineNr">1576 </span>    <span class="subxComment"># trace-sssns(&quot;label &quot; lrow-&gt;key &quot; is at address &quot; lrow-&gt;address &quot;.&quot;)</span>
<span id="L1577" class="LineNr">1577 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1578" class="LineNr">1578 </span>    68/push  <span class="Constant">&quot;.&quot;</span>/imm32
<span id="L1579" class="LineNr">1579 </span>    53/push-ebx
<span id="L1580" class="LineNr">1580 </span>    68/push  <span class="Constant">&quot;' is at address &quot;</span>/imm32
<span id="L1581" class="LineNr">1581 </span>    ff          6/subop/push        0/mod/indirect  0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># push *eax</span>
<span id="L1582" class="LineNr">1582 </span>    68/push  <span class="Constant">&quot;label '&quot;</span>/imm32
<span id="L1583" class="LineNr">1583 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1584" class="LineNr">1584 </span>    e8/call  <a href='survey.subx.html#L3557'>trace-sssns</a>/disp32
<span id="L1585" class="LineNr">1585 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1586" class="LineNr">1586 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x14/imm32        <span class="subxComment"># add to esp</span>
<span id="L1587" class="LineNr">1587 </span>    <span class="subxComment"># lrow += 16  # size of row</span>
<span id="L1588" class="LineNr">1588 </span>    05/add-to-eax  0x10/imm32
<span id="L1589" class="LineNr">1589 </span>    e9/jump  $compute-addresses:label-loop/disp32
<span id="L1590" class="LineNr">1590 </span><span class="Constant">$compute-addresses:end</span>:
<span id="L1591" class="LineNr">1591 </span>    <span class="subxS1Comment"># . restore registers</span>
<span id="L1592" class="LineNr">1592 </span>    5f/pop-to-edi
<span id="L1593" class="LineNr">1593 </span>    5e/pop-to-esi
<span id="L1594" class="LineNr">1594 </span>    5b/pop-to-ebx
<span id="L1595" class="LineNr">1595 </span>    5a/pop-to-edx
<span id="L1596" class="LineNr">1596 </span>    59/pop-to-ecx
<span id="L1597" class="LineNr">1597 </span>    58/pop-to-eax
<span id="L1598" class="LineNr">1598 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L1599" class="LineNr">1599 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L1600" class="LineNr">1600 </span>    5d/pop-to-ebp
<span id="L1601" class="LineNr">1601 </span>    c3/return
<span id="L1602" class="LineNr">1602 </span>
<span id="L1603" class="LineNr">1603 </span><span class="subxTest">test-compute-addresses</span>:
<span id="L1604" class="LineNr">1604 </span>    <span class="subxComment"># input:</span>
<span id="L1605" class="LineNr">1605 </span>    <span class="subxComment">#   segments:</span>
<span id="L1606" class="LineNr">1606 </span>    <span class="subxComment">#     - 'a': {0x1000, 0, 5}</span>
<span id="L1607" class="LineNr">1607 </span>    <span class="subxComment">#     - 'b': {0x2018, 5, 1}</span>
<span id="L1608" class="LineNr">1608 </span>    <span class="subxComment">#     - 'c': {0x5444, 6, 12}</span>
<span id="L1609" class="LineNr">1609 </span>    <span class="subxComment">#   labels:</span>
<span id="L1610" class="LineNr">1610 </span>    <span class="subxComment">#     - 'l1': {'a', 3, 0}</span>
<span id="L1611" class="LineNr">1611 </span>    <span class="subxComment">#     - 'l2': {'b', 0, 0}</span>
<span id="L1612" class="LineNr">1612 </span>    <span class="subxComment">#</span>
<span id="L1613" class="LineNr">1613 </span>    <span class="subxComment"># trace contains in any order (comments in parens):</span>
<span id="L1614" class="LineNr">1614 </span>    <span class="subxComment">#   segment 'a' starts at address 0x00001094.  (0x34 + 0x20 for each segment)</span>
<span id="L1615" class="LineNr">1615 </span>    <span class="subxComment">#   segment 'b' starts at address 0x00002099.  (0x018 discarded)</span>
<span id="L1616" class="LineNr">1616 </span>    <span class="subxComment">#   segment 'c' starts at address 0x0000509a.  (0x444 discarded)</span>
<span id="L1617" class="LineNr">1617 </span>    <span class="subxComment">#   label 'l1' is at address 0x00001097.       (0x1094 + segment-offset 3)</span>
<span id="L1618" class="LineNr">1618 </span>    <span class="subxComment">#   label 'l2' is at address 0x00002099.       (0x2099 + segment-offset 0)</span>
<span id="L1619" class="LineNr">1619 </span>    <span class="subxComment">#</span>
<span id="L1620" class="LineNr">1620 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L1621" class="LineNr">1621 </span>    55/push-ebp
<span id="L1622" class="LineNr">1622 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L1623" class="LineNr">1623 </span>    <span class="subxComment"># setup</span>
<span id="L1624" class="LineNr">1624 </span>    <span class="subxS1Comment"># . var segments/ecx : (stream byte 10*16)</span>
<span id="L1625" class="LineNr">1625 </span>    81          5/subop/subtract    3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xa0/imm32        <span class="subxComment"># subtract from esp</span>
<span id="L1626" class="LineNr">1626 </span>    68/push  0xa0/imm32/length
<span id="L1627" class="LineNr">1627 </span>    68/push  0/imm32/read
<span id="L1628" class="LineNr">1628 </span>    68/push  0/imm32/write
<span id="L1629" class="LineNr">1629 </span>    89/copy                         3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ecx</span>
<span id="L1630" class="LineNr">1630 </span>    <span class="subxS1Comment"># . var labels/edx : (stream byte 512*16)</span>
<span id="L1631" class="LineNr">1631 </span>    81          5/subop/subtract    3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x2000/imm32      <span class="subxComment"># subtract from esp</span>
<span id="L1632" class="LineNr">1632 </span>    68/push  0x2000/imm32/length
<span id="L1633" class="LineNr">1633 </span>    68/push  0/imm32/read
<span id="L1634" class="LineNr">1634 </span>    68/push  0/imm32/write
<span id="L1635" class="LineNr">1635 </span>    89/copy                         3/mod/direct    2/rm32/edx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to edx</span>
<span id="L1636" class="LineNr">1636 </span>    <span class="subxS1Comment"># . stream-add4(segments, &quot;a&quot;, 0x1000, 0, 5)</span>
<span id="L1637" class="LineNr">1637 </span>    68/push  5/imm32/segment-size
<span id="L1638" class="LineNr">1638 </span>    68/push  0/imm32/file-offset
<span id="L1639" class="LineNr">1639 </span>    68/push  0x1000/imm32/start-address
<span id="L1640" class="LineNr">1640 </span>    68/push  <span class="Constant">&quot;a&quot;</span>/imm32/segment-name
<span id="L1641" class="LineNr">1641 </span>    51/push-ecx
<span id="L1642" class="LineNr">1642 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1643" class="LineNr">1643 </span>    e8/call  <a href='survey.subx.html#L3471'>stream-add4</a>/disp32
<span id="L1644" class="LineNr">1644 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1645" class="LineNr">1645 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x14/imm32        <span class="subxComment"># add to esp</span>
<span id="L1646" class="LineNr">1646 </span>    <span class="subxS1Comment"># . stream-add4(segments, &quot;b&quot;, 0x2018, 5, 1)</span>
<span id="L1647" class="LineNr">1647 </span>    68/push  1/imm32/segment-size
<span id="L1648" class="LineNr">1648 </span>    68/push  5/imm32/file-offset
<span id="L1649" class="LineNr">1649 </span>    68/push  0x2018/imm32/start-address
<span id="L1650" class="LineNr">1650 </span>    68/push  <span class="Constant">&quot;b&quot;</span>/imm32/segment-name
<span id="L1651" class="LineNr">1651 </span>    51/push-ecx
<span id="L1652" class="LineNr">1652 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1653" class="LineNr">1653 </span>    e8/call  <a href='survey.subx.html#L3471'>stream-add4</a>/disp32
<span id="L1654" class="LineNr">1654 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1655" class="LineNr">1655 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x14/imm32        <span class="subxComment"># add to esp</span>
<span id="L1656" class="LineNr">1656 </span>    <span class="subxS1Comment"># . stream-add4(segments, &quot;c&quot;, 0x5444, 6, 12)</span>
<span id="L1657" class="LineNr">1657 </span>    68/push  0xc/imm32/segment-size
<span id="L1658" class="LineNr">1658 </span>    68/push  6/imm32/file-offset
<span id="L1659" class="LineNr">1659 </span>    68/push  0x5444/imm32/start-address
<span id="L1660" class="LineNr">1660 </span>    68/push  <span class="Constant">&quot;c&quot;</span>/imm32/segment-name
<span id="L1661" class="LineNr">1661 </span>    51/push-ecx
<span id="L1662" class="LineNr">1662 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1663" class="LineNr">1663 </span>    e8/call  <a href='survey.subx.html#L3471'>stream-add4</a>/disp32
<span id="L1664" class="LineNr">1664 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1665" class="LineNr">1665 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x14/imm32        <span class="subxComment"># add to esp</span>
<span id="L1666" class="LineNr">1666 </span>    <span class="subxS1Comment"># . stream-add4(labels, &quot;l1&quot;, &quot;a&quot;, 3, 0)</span>
<span id="L1667" class="LineNr">1667 </span>    68/push  0/imm32/label-address
<span id="L1668" class="LineNr">1668 </span>    68/push  3/imm32/segment-offset
<span id="L1669" class="LineNr">1669 </span>    68/push  <span class="Constant">&quot;a&quot;</span>/imm32/segment-name
<span id="L1670" class="LineNr">1670 </span>    68/push  <span class="Constant">&quot;l1&quot;</span>/imm32/label-name
<span id="L1671" class="LineNr">1671 </span>    52/push-edx
<span id="L1672" class="LineNr">1672 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1673" class="LineNr">1673 </span>    e8/call  <a href='survey.subx.html#L3471'>stream-add4</a>/disp32
<span id="L1674" class="LineNr">1674 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1675" class="LineNr">1675 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x14/imm32        <span class="subxComment"># add to esp</span>
<span id="L1676" class="LineNr">1676 </span>    <span class="subxS1Comment"># . stream-add4(labels, &quot;l2&quot;, &quot;b&quot;, 0, 0)</span>
<span id="L1677" class="LineNr">1677 </span>    68/push  0/imm32/label-address
<span id="L1678" class="LineNr">1678 </span>    68/push  0/imm32/segment-offset
<span id="L1679" class="LineNr">1679 </span>    68/push  <span class="Constant">&quot;b&quot;</span>/imm32/segment-name
<span id="L1680" class="LineNr">1680 </span>    68/push  <span class="Constant">&quot;l2&quot;</span>/imm32/label-name
<span id="L1681" class="LineNr">1681 </span>    52/push-edx
<span id="L1682" class="LineNr">1682 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1683" class="LineNr">1683 </span>    e8/call  <a href='survey.subx.html#L3471'>stream-add4</a>/disp32
<span id="L1684" class="LineNr">1684 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1685" class="LineNr">1685 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x14/imm32        <span class="subxComment"># add to esp</span>
<span id="L1686" class="LineNr">1686 </span>    <span class="subxComment"># component under test</span>
<span id="L1687" class="LineNr">1687 </span>    <span class="subxS1Comment"># . compute-addresses(segments, labels)</span>
<span id="L1688" class="LineNr">1688 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1689" class="LineNr">1689 </span>    52/push-edx
<span id="L1690" class="LineNr">1690 </span>    51/push-ecx
<span id="L1691" class="LineNr">1691 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1692" class="LineNr">1692 </span>    e8/call  <a href='survey.subx.html#L1381'>compute-addresses</a>/disp32
<span id="L1693" class="LineNr">1693 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1694" class="LineNr">1694 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L1695" class="LineNr">1695 </span>    <span class="subxComment"># checks</span>
<span id="L1696" class="Folded">1696 </span><span class="Folded">+-- 26 lines: #?     # dump *Trace-stream --------------------------------------------------------------------------------------------------------------------</span>
<span id="L1722" class="LineNr">1722 </span>    <span class="subxS1Comment"># . check-trace-contains(&quot;segment 'a' starts at address 0x00001094.&quot;, msg)</span>
<span id="L1723" class="LineNr">1723 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1724" class="LineNr">1724 </span>    68/push  <span class="Constant">&quot;F - <a href='survey.subx.html#L1603'>test-compute-addresses</a>/0&quot;</span>/imm32
<span id="L1725" class="LineNr">1725 </span>    68/push  <span class="Constant">&quot;segment 'a' starts at address 0x00001094.&quot;</span>/imm32
<span id="L1726" class="LineNr">1726 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1727" class="LineNr">1727 </span>    e8/call  <a href='../056trace.subx.html#L253'>check-trace-contains</a>/disp32
<span id="L1728" class="LineNr">1728 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1729" class="LineNr">1729 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L1730" class="LineNr">1730 </span>    <span class="subxS1Comment"># . check-trace-contains(&quot;segment 'b' starts at address 0x00002099.&quot;, msg)</span>
<span id="L1731" class="LineNr">1731 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1732" class="LineNr">1732 </span>    68/push  <span class="Constant">&quot;F - <a href='survey.subx.html#L1603'>test-compute-addresses</a>/1&quot;</span>/imm32
<span id="L1733" class="LineNr">1733 </span>    68/push  <span class="Constant">&quot;segment 'b' starts at address 0x00002099.&quot;</span>/imm32
<span id="L1734" class="LineNr">1734 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1735" class="LineNr">1735 </span>    e8/call  <a href='../056trace.subx.html#L253'>check-trace-contains</a>/disp32
<span id="L1736" class="LineNr">1736 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1737" class="LineNr">1737 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L1738" class="LineNr">1738 </span>    <span class="subxS1Comment"># . check-trace-contains(&quot;segment 'c' starts at address 0x0000509a.&quot;, msg)</span>
<span id="L1739" class="LineNr">1739 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1740" class="LineNr">1740 </span>    68/push  <span class="Constant">&quot;F - <a href='survey.subx.html#L1603'>test-compute-addresses</a>/2&quot;</span>/imm32
<span id="L1741" class="LineNr">1741 </span>    68/push  <span class="Constant">&quot;segment 'c' starts at address 0x0000509a.&quot;</span>/imm32
<span id="L1742" class="LineNr">1742 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1743" class="LineNr">1743 </span>    e8/call  <a href='../056trace.subx.html#L253'>check-trace-contains</a>/disp32
<span id="L1744" class="LineNr">1744 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1745" class="LineNr">1745 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L1746" class="LineNr">1746 </span>    <span class="subxS1Comment"># . check-trace-contains(&quot;label 'l1' is at address 0x00001097.&quot;, msg)</span>
<span id="L1747" class="LineNr">1747 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1748" class="LineNr">1748 </span>    68/push  <span class="Constant">&quot;F - <a href='survey.subx.html#L1603'>test-compute-addresses</a>/3&quot;</span>/imm32
<span id="L1749" class="LineNr">1749 </span>    68/push  <span class="Constant">&quot;label 'l1' is at address 0x00001097.&quot;</span>/imm32
<span id="L1750" class="LineNr">1750 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1751" class="LineNr">1751 </span>    e8/call  <a href='../056trace.subx.html#L253'>check-trace-contains</a>/disp32
<span id="L1752" class="LineNr">1752 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1753" class="LineNr">1753 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L1754" class="LineNr">1754 </span>    <span class="subxS1Comment"># . check-trace-contains(&quot;label 'l2' is at address 0x00002099.&quot;, msg)</span>
<span id="L1755" class="LineNr">1755 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1756" class="LineNr">1756 </span>    68/push  <span class="Constant">&quot;F - <a href='survey.subx.html#L1603'>test-compute-addresses</a>/4&quot;</span>/imm32
<span id="L1757" class="LineNr">1757 </span>    68/push  <span class="Constant">&quot;label 'l2' is at address 0x00002099.&quot;</span>/imm32
<span id="L1758" class="LineNr">1758 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1759" class="LineNr">1759 </span>    e8/call  <a href='../056trace.subx.html#L253'>check-trace-contains</a>/disp32
<span id="L1760" class="LineNr">1760 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1761" class="LineNr">1761 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L1762" class="LineNr">1762 </span>    <span class="subxS1Comment"># . check-ints-equal(labels-&gt;write, 0x20, msg)</span>
<span id="L1763" class="LineNr">1763 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1764" class="LineNr">1764 </span>    68/push  <span class="Constant">&quot;F - <a href='survey.subx.html#L1603'>test-compute-addresses</a>/maintains-labels-write-index&quot;</span>/imm32
<span id="L1765" class="LineNr">1765 </span>    68/push  0x20/imm32/2-entries
<span id="L1766" class="LineNr">1766 </span>    ff          6/subop/push        0/mod/indirect  2/rm32/edx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># push *edx</span>
<span id="L1767" class="LineNr">1767 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1768" class="LineNr">1768 </span>    e8/call  <a href='../051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L1769" class="LineNr">1769 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1770" class="LineNr">1770 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L1771" class="LineNr">1771 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L1772" class="LineNr">1772 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L1773" class="LineNr">1773 </span>    5d/pop-to-ebp
<span id="L1774" class="LineNr">1774 </span>    c3/return
<span id="L1775" class="LineNr">1775 </span>
<span id="L1776" class="LineNr">1776 </span><span class="subxTest">test-compute-addresses-large-segments</span>:
<span id="L1777" class="LineNr">1777 </span>    <span class="subxComment"># input:</span>
<span id="L1778" class="LineNr">1778 </span>    <span class="subxComment">#   segments:</span>
<span id="L1779" class="LineNr">1779 </span>    <span class="subxComment">#     - 'a': {0x1000, 0, 0x5604}</span>
<span id="L1780" class="LineNr">1780 </span>    <span class="subxComment">#     - 'b': {0x2018, 0x5604, 1}</span>
<span id="L1781" class="LineNr">1781 </span>    <span class="subxComment">#   labels:</span>
<span id="L1782" class="LineNr">1782 </span>    <span class="subxComment">#     - 'l1': {'a', 3, 0}</span>
<span id="L1783" class="LineNr">1783 </span>    <span class="subxComment">#</span>
<span id="L1784" class="LineNr">1784 </span>    <span class="subxComment"># trace contains in any order (comments in parens):</span>
<span id="L1785" class="LineNr">1785 </span>    <span class="subxComment">#   segment 'a' starts at address 0x00001074.  (0x34 + 0x20 for each segment)</span>
<span id="L1786" class="LineNr">1786 </span>    <span class="subxComment">#   segment 'b' starts at address 0x00002678.  (0x018 discarded; last 3 nibbles from 0x1074 + 0x5604)</span>
<span id="L1787" class="LineNr">1787 </span>    <span class="subxComment">#   label 'l1' is at address 0x00001077.       (0x1074 + segment-offset 3)</span>
<span id="L1788" class="LineNr">1788 </span>    <span class="subxComment">#</span>
<span id="L1789" class="LineNr">1789 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L1790" class="LineNr">1790 </span>    55/push-ebp
<span id="L1791" class="LineNr">1791 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L1792" class="LineNr">1792 </span>    <span class="subxComment"># setup</span>
<span id="L1793" class="LineNr">1793 </span>    <span class="subxS1Comment"># . var segments/ecx : (stream byte 10*16)</span>
<span id="L1794" class="LineNr">1794 </span>    81          5/subop/subtract    3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xa0/imm32        <span class="subxComment"># subtract from esp</span>
<span id="L1795" class="LineNr">1795 </span>    68/push  0xa0/imm32/length
<span id="L1796" class="LineNr">1796 </span>    68/push  0/imm32/read
<span id="L1797" class="LineNr">1797 </span>    68/push  0/imm32/write
<span id="L1798" class="LineNr">1798 </span>    89/copy                         3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ecx</span>
<span id="L1799" class="LineNr">1799 </span>    <span class="subxS1Comment"># . var labels/edx : (stream byte 512*16)</span>
<span id="L1800" class="LineNr">1800 </span>    81          5/subop/subtract    3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x2000/imm32      <span class="subxComment"># subtract from esp</span>
<span id="L1801" class="LineNr">1801 </span>    68/push  0x2000/imm32/length
<span id="L1802" class="LineNr">1802 </span>    68/push  0/imm32/read
<span id="L1803" class="LineNr">1803 </span>    68/push  0/imm32/write
<span id="L1804" class="LineNr">1804 </span>    89/copy                         3/mod/direct    2/rm32/edx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to edx</span>
<span id="L1805" class="LineNr">1805 </span>    <span class="subxS1Comment"># . stream-add4(segments, &quot;a&quot;, 0x1000, 0, 0x5604)</span>
<span id="L1806" class="LineNr">1806 </span>    68/push  0x5604/imm32/segment-size
<span id="L1807" class="LineNr">1807 </span>    68/push  0/imm32/file-offset
<span id="L1808" class="LineNr">1808 </span>    68/push  0x1000/imm32/start-address
<span id="L1809" class="LineNr">1809 </span>    68/push  <span class="Constant">&quot;a&quot;</span>/imm32/segment-name
<span id="L1810" class="LineNr">1810 </span>    51/push-ecx
<span id="L1811" class="LineNr">1811 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1812" class="LineNr">1812 </span>    e8/call  <a href='survey.subx.html#L3471'>stream-add4</a>/disp32
<span id="L1813" class="LineNr">1813 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1814" class="LineNr">1814 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x14/imm32        <span class="subxComment"># add to esp</span>
<span id="L1815" class="LineNr">1815 </span>    <span class="subxS1Comment"># . stream-add4(segments, &quot;b&quot;, 0x2018, 0x5604, 1)</span>
<span id="L1816" class="LineNr">1816 </span>    68/push  1/imm32/segment-size
<span id="L1817" class="LineNr">1817 </span>    68/push  0x5604/imm32/file-offset
<span id="L1818" class="LineNr">1818 </span>    68/push  0x2018/imm32/start-address
<span id="L1819" class="LineNr">1819 </span>    68/push  <span class="Constant">&quot;b&quot;</span>/imm32/segment-name
<span id="L1820" class="LineNr">1820 </span>    51/push-ecx
<span id="L1821" class="LineNr">1821 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1822" class="LineNr">1822 </span>    e8/call  <a href='survey.subx.html#L3471'>stream-add4</a>/disp32
<span id="L1823" class="LineNr">1823 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1824" class="LineNr">1824 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x14/imm32        <span class="subxComment"># add to esp</span>
<span id="L1825" class="LineNr">1825 </span>    <span class="subxS1Comment"># . stream-add4(labels, &quot;l1&quot;, &quot;a&quot;, 3, 0)</span>
<span id="L1826" class="LineNr">1826 </span>    68/push  0/imm32/label-address
<span id="L1827" class="LineNr">1827 </span>    68/push  3/imm32/segment-offset
<span id="L1828" class="LineNr">1828 </span>    68/push  <span class="Constant">&quot;a&quot;</span>/imm32/segment-name
<span id="L1829" class="LineNr">1829 </span>    68/push  <span class="Constant">&quot;l1&quot;</span>/imm32/label-name
<span id="L1830" class="LineNr">1830 </span>    52/push-edx
<span id="L1831" class="LineNr">1831 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1832" class="LineNr">1832 </span>    e8/call  <a href='survey.subx.html#L3471'>stream-add4</a>/disp32
<span id="L1833" class="LineNr">1833 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1834" class="LineNr">1834 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x14/imm32        <span class="subxComment"># add to esp</span>
<span id="L1835" class="LineNr">1835 </span>    <span class="subxComment"># component under test</span>
<span id="L1836" class="LineNr">1836 </span>    <span class="subxS1Comment"># . compute-addresses(segments, labels)</span>
<span id="L1837" class="LineNr">1837 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1838" class="LineNr">1838 </span>    52/push-edx
<span id="L1839" class="LineNr">1839 </span>    51/push-ecx
<span id="L1840" class="LineNr">1840 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1841" class="LineNr">1841 </span>    e8/call  <a href='survey.subx.html#L1381'>compute-addresses</a>/disp32
<span id="L1842" class="LineNr">1842 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1843" class="LineNr">1843 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L1844" class="LineNr">1844 </span>    <span class="subxComment"># checks</span>
<span id="L1845" class="LineNr">1845 </span>    <span class="subxS1Comment"># . check-trace-contains(&quot;segment 'a' starts at address 0x00001074.&quot;, msg)</span>
<span id="L1846" class="LineNr">1846 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1847" class="LineNr">1847 </span>    68/push  <span class="Constant">&quot;F - <a href='survey.subx.html#L1776'>test-compute-addresses-large-segments</a>/0&quot;</span>/imm32
<span id="L1848" class="LineNr">1848 </span>    68/push  <span class="Constant">&quot;segment 'a' starts at address 0x00001074.&quot;</span>/imm32
<span id="L1849" class="LineNr">1849 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1850" class="LineNr">1850 </span>    e8/call  <a href='../056trace.subx.html#L253'>check-trace-contains</a>/disp32
<span id="L1851" class="LineNr">1851 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1852" class="LineNr">1852 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L1853" class="LineNr">1853 </span>    <span class="subxS1Comment"># . check-trace-contains(&quot;segment 'b' starts at address 0x00002678.&quot;, msg)</span>
<span id="L1854" class="LineNr">1854 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1855" class="LineNr">1855 </span>    68/push  <span class="Constant">&quot;F - <a href='survey.subx.html#L1776'>test-compute-addresses-large-segments</a>/1&quot;</span>/imm32
<span id="L1856" class="LineNr">1856 </span>    68/push  <span class="Constant">&quot;segment 'b' starts at address 0x00002678.&quot;</span>/imm32
<span id="L1857" class="LineNr">1857 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1858" class="LineNr">1858 </span>    e8/call  <a href='../056trace.subx.html#L253'>check-trace-contains</a>/disp32
<span id="L1859" class="LineNr">1859 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1860" class="LineNr">1860 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L1861" class="LineNr">1861 </span>    <span class="subxS1Comment"># . check-trace-contains(&quot;label 'l1' is at address 0x00001077.&quot;, msg)</span>
<span id="L1862" class="LineNr">1862 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1863" class="LineNr">1863 </span>    68/push  <span class="Constant">&quot;F - <a href='survey.subx.html#L1776'>test-compute-addresses-large-segments</a>/3&quot;</span>/imm32
<span id="L1864" class="LineNr">1864 </span>    68/push  <span class="Constant">&quot;label 'l1' is at address 0x00001077.&quot;</span>/imm32
<span id="L1865" class="LineNr">1865 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1866" class="LineNr">1866 </span>    e8/call  <a href='../056trace.subx.html#L253'>check-trace-contains</a>/disp32
<span id="L1867" class="LineNr">1867 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1868" class="LineNr">1868 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L1869" class="LineNr">1869 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L1870" class="LineNr">1870 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L1871" class="LineNr">1871 </span>    5d/pop-to-ebp
<span id="L1872" class="LineNr">1872 </span>    c3/return
<span id="L1873" class="LineNr">1873 </span>
<span id="L1874" class="LineNr">1874 </span><span class="subxFunction">emit-output</span>:  <span class="subxComment"># in : (addr stream byte), out : (addr buffered-file), segments : (addr stream {string, segment-info}), labels : (addr stream {string, label-info})</span>
<span id="L1875" class="LineNr">1875 </span>    <span class="subxComment"># pseudocode:</span>
<span id="L1876" class="LineNr">1876 </span>    <span class="subxComment">#   emit-headers(out, segments, labels)</span>
<span id="L1877" class="LineNr">1877 </span>    <span class="subxComment">#   emit-segments(in, out, segments, labels)</span>
<span id="L1878" class="LineNr">1878 </span>    <span class="subxComment">#</span>
<span id="L1879" class="LineNr">1879 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L1880" class="LineNr">1880 </span>    55/push-ebp
<span id="L1881" class="LineNr">1881 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L1882" class="Folded">1882 </span><span class="Folded">+--  9 lines: #?     # write(2/stderr, &quot;emit-headers\n&quot;) -----------------------------------------------------------------------------------------------------</span>
<span id="L1891" class="LineNr">1891 </span>    <span class="subxComment"># emit-headers(out, segments, labels)</span>
<span id="L1892" class="LineNr">1892 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1893" class="LineNr">1893 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0x14/disp8      <span class="Normal"> . </span>               <span class="subxComment"># push *(ebp+20)</span>
<span id="L1894" class="LineNr">1894 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0x10/disp8      <span class="Normal"> . </span>               <span class="subxComment"># push *(ebp+16)</span>
<span id="L1895" class="LineNr">1895 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0xc/disp8       <span class="Normal"> . </span>               <span class="subxComment"># push *(ebp+12)</span>
<span id="L1896" class="LineNr">1896 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1897" class="LineNr">1897 </span>    e8/call  <a href='survey.subx.html#L3176'>emit-headers</a>/disp32
<span id="L1898" class="LineNr">1898 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1899" class="LineNr">1899 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L1900" class="Folded">1900 </span><span class="Folded">+--  9 lines: #?     # write(2/stderr, &quot;emit-segments\n&quot;) ----------------------------------------------------------------------------------------------------</span>
<span id="L1909" class="LineNr">1909 </span>    <span class="subxComment"># emit-segments(in, out, segments, labels)</span>
<span id="L1910" class="LineNr">1910 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L1911" class="LineNr">1911 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0x14/disp8      <span class="Normal"> . </span>               <span class="subxComment"># push *(ebp+20)</span>
<span id="L1912" class="LineNr">1912 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0x10/disp8      <span class="Normal"> . </span>               <span class="subxComment"># push *(ebp+16)</span>
<span id="L1913" class="LineNr">1913 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+12)</span>
<span id="L1914" class="LineNr">1914 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+8)</span>
<span id="L1915" class="LineNr">1915 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L1916" class="LineNr">1916 </span>    e8/call  <a href='survey.subx.html#L1925'>emit-segments</a>/disp32
<span id="L1917" class="LineNr">1917 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L1918" class="LineNr">1918 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x10/imm32        <span class="subxComment"># add to esp</span>
<span id="L1919" class="LineNr">1919 </span><span class="Constant">$emit-output:end</span>:
<span id="L1920" class="LineNr">1920 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L1921" class="LineNr">1921 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L1922" class="LineNr">1922 </span>    5d/pop-to-ebp
<span id="L1923" class="LineNr">1923 </span>    c3/return
<span id="L1924" class="LineNr">1924 </span>
<span id="L1925" class="LineNr">1925 </span><span class="subxFunction">emit-segments</span>:  <span class="subxComment"># in : (addr stream byte), out : (addr buffered-file), segments : (addr stream {string, segment-info}), labels : (addr stream {string, label-info})</span>
<span id="L1926" class="LineNr">1926 </span>    <span class="subxComment"># pseudocode:</span>
<span id="L1927" class="LineNr">1927 </span>    <span class="subxComment">#   var offset-of-next-instruction = 0</span>
<span id="L1928" class="LineNr">1928 </span>    <span class="subxComment">#   var line : (stream byte 512)</span>
<span id="L1929" class="LineNr">1929 </span>    <span class="subxComment">#   line-loop:</span>
<span id="L1930" class="LineNr">1930 </span>    <span class="subxComment">#   while true</span>
<span id="L1931" class="LineNr">1931 </span>    <span class="subxComment">#     clear-stream(line)</span>
<span id="L1932" class="LineNr">1932 </span>    <span class="subxComment">#     read-line(in, line)</span>
<span id="L1933" class="LineNr">1933 </span>    <span class="subxComment">#     if (line-&gt;write == 0) break               # end of file</span>
<span id="L1934" class="LineNr">1934 </span>    <span class="subxComment">#     offset-of-next-instruction += num-bytes(line)</span>
<span id="L1935" class="LineNr">1935 </span>    <span class="subxComment">#     while true</span>
<span id="L1936" class="LineNr">1936 </span>    <span class="subxComment">#       var word-slice = next-word(line)</span>
<span id="L1937" class="LineNr">1937 </span>    <span class="subxComment">#       if slice-empty?(word-slice)             # end of line</span>
<span id="L1938" class="LineNr">1938 </span>    <span class="subxComment">#         break</span>
<span id="L1939" class="LineNr">1939 </span>    <span class="subxComment">#       if slice-starts-with?(word-slice, &quot;#&quot;)  # comment</span>
<span id="L1940" class="LineNr">1940 </span>    <span class="subxComment">#         break</span>
<span id="L1941" class="LineNr">1941 </span>    <span class="subxComment">#       if is-label?(word-slice)                # no need for label declarations anymore</span>
<span id="L1942" class="LineNr">1942 </span>    <span class="subxComment">#         goto line-loop                        # don't insert empty lines</span>
<span id="L1943" class="LineNr">1943 </span>    <span class="subxComment">#       if slice-equal?(word-slice, &quot;==&quot;)       # no need for segment header lines</span>
<span id="L1944" class="LineNr">1944 </span>    <span class="subxComment">#         goto line-loop                        # don't insert empty lines</span>
<span id="L1945" class="LineNr">1945 </span>    <span class="subxComment">#       if length(word-slice) == 2</span>
<span id="L1946" class="LineNr">1946 </span>    <span class="subxComment">#         write-slice-buffered(out, word-slice)</span>
<span id="L1947" class="LineNr">1947 </span>    <span class="subxComment">#         write-buffered(out, &quot; &quot;)</span>
<span id="L1948" class="LineNr">1948 </span>    <span class="subxComment">#         continue</span>
<span id="L1949" class="LineNr">1949 </span>    <span class="subxComment">#       datum = next-token-from-slice(word-slice-&gt;start, word-slice-&gt;end, &quot;/&quot;)</span>
<span id="L1950" class="LineNr">1950 </span>    <span class="subxComment">#       info = get-slice(labels, datum)</span>
<span id="L1951" class="LineNr">1951 </span>    <span class="subxComment">#       if !string-equal?(info-&gt;segment-name, &quot;code&quot;)</span>
<span id="L1952" class="LineNr">1952 </span>    <span class="subxComment">#         if has-metadata?(word-slice, &quot;disp8&quot;)</span>
<span id="L1953" class="LineNr">1953 </span>    <span class="subxComment">#           abort</span>
<span id="L1954" class="LineNr">1954 </span>    <span class="subxComment">#         if has-metadata?(word-slice, &quot;imm8&quot;)</span>
<span id="L1955" class="LineNr">1955 </span>    <span class="subxComment">#           abort</span>
<span id="L1956" class="LineNr">1956 </span>    <span class="subxComment">#         emit(out, info-&gt;address, 4)  # global variables always translate init.linux to absolute addresses</span>
<span id="L1957" class="LineNr">1957 </span>    <span class="subxComment">#       # code segment cases</span>
<span id="L1958" class="LineNr">1958 </span>    <span class="subxComment">#       else if has-metadata?(word-slice, &quot;imm8&quot;)</span>
<span id="L1959" class="LineNr">1959 </span>    <span class="subxComment">#         abort  # label should never go to imm8</span>
<span id="L1960" class="LineNr">1960 </span>    <span class="subxComment">#       else if has-metadata?(word-slice, &quot;imm32&quot;)</span>
<span id="L1961" class="LineNr">1961 </span>    <span class="subxComment">#         emit(out, info-&gt;address, 4)</span>
<span id="L1962" class="LineNr">1962 </span>    <span class="subxComment">#       else if has-metadata?(word-slice, &quot;disp8&quot;)</span>
<span id="L1963" class="LineNr">1963 </span>    <span class="subxComment">#         value = info-&gt;offset - offset-of-next-instruction</span>
<span id="L1964" class="LineNr">1964 </span>    <span class="subxComment">#         emit(out, value, 1)</span>
<span id="L1965" class="LineNr">1965 </span>    <span class="subxComment">#       else if has-metadata?(word-slice, &quot;disp32&quot;)</span>
<span id="L1966" class="LineNr">1966 </span>    <span class="subxComment">#         value = info-&gt;offset - offset-of-next-instruction</span>
<span id="L1967" class="LineNr">1967 </span>    <span class="subxComment">#         emit(out, value, 4)</span>
<span id="L1968" class="LineNr">1968 </span>    <span class="subxComment">#       else</span>
<span id="L1969" class="LineNr">1969 </span>    <span class="subxComment">#         abort</span>
<span id="L1970" class="LineNr">1970 </span>    <span class="subxComment">#     write-buffered(out, &quot;\n&quot;)</span>
<span id="L1971" class="LineNr">1971 </span>    <span class="subxComment">#</span>
<span id="L1972" class="LineNr">1972 </span>    <span class="subxComment"># registers:</span>
<span id="L1973" class="LineNr">1973 </span>    <span class="subxComment">#   line: ecx</span>
<span id="L1974" class="LineNr">1974 </span>    <span class="subxComment">#   word-slice: edx</span>
<span id="L1975" class="LineNr">1975 </span>    <span class="subxComment">#   offset-of-next-instruction: ebx</span>
<span id="L1976" class="LineNr">1976 </span>    <span class="subxComment">#   datum: edi</span>
<span id="L1977" class="LineNr">1977 </span>    <span class="subxComment">#   info: esi (inner loop only)</span>
<span id="L1978" class="LineNr">1978 </span>    <span class="subxComment">#   temporaries: eax, esi (outer loop)</span>
<span id="L1979" class="LineNr">1979 </span>    <span class="subxComment">#</span>
<span id="L1980" class="LineNr">1980 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L1981" class="LineNr">1981 </span>    55/push-ebp
<span id="L1982" class="LineNr">1982 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L1983" class="LineNr">1983 </span>    <span class="subxS1Comment"># . save registers</span>
<span id="L1984" class="LineNr">1984 </span>    50/push-eax
<span id="L1985" class="LineNr">1985 </span>    51/push-ecx
<span id="L1986" class="LineNr">1986 </span>    52/push-edx
<span id="L1987" class="LineNr">1987 </span>    53/push-ebx
<span id="L1988" class="LineNr">1988 </span>    56/push-esi
<span id="L1989" class="LineNr">1989 </span>    57/push-edi
<span id="L1990" class="LineNr">1990 </span>    <span class="subxComment"># var line/ecx : (stream byte 512)</span>
<span id="L1991" class="LineNr">1991 </span>    81          5/subop/subtract    3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x200/imm32       <span class="subxComment"># subtract from esp</span>
<span id="L1992" class="LineNr">1992 </span>    68/push  0x200/imm32/length
<span id="L1993" class="LineNr">1993 </span>    68/push  0/imm32/read
<span id="L1994" class="LineNr">1994 </span>    68/push  0/imm32/write
<span id="L1995" class="LineNr">1995 </span>    89/copy                         3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ecx</span>
<span id="L1996" class="LineNr">1996 </span>    <span class="subxComment"># var word-slice/edx : slice</span>
<span id="L1997" class="LineNr">1997 </span>    68/push  0/imm32/end
<span id="L1998" class="LineNr">1998 </span>    68/push  0/imm32/start
<span id="L1999" class="LineNr">1999 </span>    89/copy                         3/mod/direct    2/rm32/edx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to edx</span>
<span id="L2000" class="LineNr">2000 </span>    <span class="subxComment"># var datum/edi : slice</span>
<span id="L2001" class="LineNr">2001 </span>    68/push  0/imm32/end
<span id="L2002" class="LineNr">2002 </span>    68/push  0/imm32/start
<span id="L2003" class="LineNr">2003 </span>    89/copy                         3/mod/direct    7/rm32/edi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to edi</span>
<span id="L2004" class="LineNr">2004 </span>    <span class="subxComment"># offset-of-next-instruction/ebx = 0</span>
<span id="L2005" class="LineNr">2005 </span>    31/xor                          3/mod/direct    3/rm32/ebx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          3/r32/ebx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># clear ebx</span>
<span id="L2006" class="LineNr">2006 </span><span class="Constant">$emit-segments:line-loop</span>:
<span id="L2007" class="LineNr">2007 </span>    <span class="subxComment"># clear-stream(line)</span>
<span id="L2008" class="LineNr">2008 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2009" class="LineNr">2009 </span>    51/push-ecx
<span id="L2010" class="LineNr">2010 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2011" class="LineNr">2011 </span>    e8/call  <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L2012" class="LineNr">2012 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2013" class="LineNr">2013 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L2014" class="LineNr">2014 </span>    <span class="subxComment"># read-line(in, line)</span>
<span id="L2015" class="LineNr">2015 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2016" class="LineNr">2016 </span>    51/push-ecx
<span id="L2017" class="LineNr">2017 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+8)</span>
<span id="L2018" class="LineNr">2018 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2019" class="LineNr">2019 </span>    e8/call  <a href='../071read-line.subx.html#L219'>read-line</a>/disp32
<span id="L2020" class="LineNr">2020 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2021" class="LineNr">2021 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L2022" class="Folded">2022 </span><span class="Folded">+-- 33 lines: #?     # dump line -----------------------------------------------------------------------------------------------------------------------------</span>
<span id="L2055" class="LineNr">2055 </span><span class="Constant">$emit-segments:check-for-end-of-input</span>:
<span id="L2056" class="LineNr">2056 </span>    <span class="subxComment"># if (line-&gt;write == 0) break</span>
<span id="L2057" class="LineNr">2057 </span>    81          7/subop/compare     0/mod/indirect  1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0/imm32           <span class="subxComment"># compare *ecx</span>
<span id="L2058" class="LineNr">2058 </span>    0f 84/jump-if-=  $emit-segments:end/disp32
<span id="L2059" class="LineNr">2059 </span>    <span class="subxComment"># offset-of-next-instruction += num-bytes(line)</span>
<span id="L2060" class="LineNr">2060 </span>    <span class="subxS1Comment"># . eax = num-bytes(line)</span>
<span id="L2061" class="LineNr">2061 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2062" class="LineNr">2062 </span>    51/push-ecx
<span id="L2063" class="LineNr">2063 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2064" class="LineNr">2064 </span>    e8/call  <a href='survey.subx.html#L4128'>num-bytes</a>/disp32
<span id="L2065" class="LineNr">2065 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2066" class="LineNr">2066 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L2067" class="LineNr">2067 </span>    <span class="subxS1Comment"># . ebx += eax</span>
<span id="L2068" class="LineNr">2068 </span>    01/add                          3/mod/direct    3/rm32/ebx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># add eax to ebx</span>
<span id="L2069" class="LineNr">2069 </span><span class="Constant">$emit-segments:word-loop</span>:
<span id="L2070" class="LineNr">2070 </span>    <span class="subxComment"># next-word(line, word-slice)</span>
<span id="L2071" class="LineNr">2071 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2072" class="LineNr">2072 </span>    52/push-edx
<span id="L2073" class="LineNr">2073 </span>    51/push-ecx
<span id="L2074" class="LineNr">2074 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2075" class="LineNr">2075 </span>    e8/call  <a href='../076next-word.subx.html#L10'>next-word</a>/disp32
<span id="L2076" class="LineNr">2076 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2077" class="LineNr">2077 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L2078" class="Folded">2078 </span><span class="Folded">+-- 33 lines: #?     # dump word-slice -----------------------------------------------------------------------------------------------------------------------</span>
<span id="L2111" class="LineNr">2111 </span><span class="Constant">$emit-segments:check-for-end-of-line</span>:
<span id="L2112" class="LineNr">2112 </span>    <span class="subxComment"># if (slice-empty?(word-slice)) break</span>
<span id="L2113" class="LineNr">2113 </span>    <span class="subxS1Comment"># . eax = slice-empty?(word-slice)</span>
<span id="L2114" class="LineNr">2114 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2115" class="LineNr">2115 </span>    52/push-edx
<span id="L2116" class="LineNr">2116 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2117" class="LineNr">2117 </span>    e8/call  <a href='../072slice.subx.html#L9'>slice-empty?</a>/disp32
<span id="L2118" class="LineNr">2118 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2119" class="LineNr">2119 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L2120" class="LineNr">2120 </span>    <span class="subxS1Comment"># . if (eax != 0) break</span>
<span id="L2121" class="LineNr">2121 </span>    3d/compare-eax-and  0/imm32
<span id="L2122" class="LineNr">2122 </span>    0f 85/jump-if-!=  $emit-segments:next-line/disp32
<span id="L2123" class="LineNr">2123 </span><span class="Constant">$emit-segments:check-for-comment</span>:
<span id="L2124" class="LineNr">2124 </span>    <span class="subxComment"># if (slice-starts-with?(word-slice, &quot;#&quot;)) break</span>
<span id="L2125" class="LineNr">2125 </span>    <span class="subxS1Comment"># . start/esi = word-slice-&gt;start</span>
<span id="L2126" class="LineNr">2126 </span>    8b/copy                         0/mod/indirect  2/rm32/edx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          6/r32/esi  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *edx to esi</span>
<span id="L2127" class="LineNr">2127 </span>    <span class="subxS1Comment"># . c/eax = *start</span>
<span id="L2128" class="LineNr">2128 </span>    31/xor                          3/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># clear eax</span>
<span id="L2129" class="LineNr">2129 </span>    8a/copy-byte                    0/mod/indirect  6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/AL   <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy byte at *esi to AL</span>
<span id="L2130" class="LineNr">2130 </span>    <span class="subxS1Comment"># . if (eax == '#') break</span>
<span id="L2131" class="LineNr">2131 </span>    3d/compare-eax-and  0x23/imm32/hash
<span id="L2132" class="LineNr">2132 </span>    0f 84/jump-if-=  $emit-segments:next-line/disp32
<span id="L2133" class="LineNr">2133 </span><span class="Constant">$emit-segments:check-for-label</span>:
<span id="L2134" class="LineNr">2134 </span>    <span class="subxComment"># if is-label?(word-slice) break</span>
<span id="L2135" class="LineNr">2135 </span>    <span class="subxS1Comment"># . eax = is-label?(word-slice)</span>
<span id="L2136" class="LineNr">2136 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2137" class="LineNr">2137 </span>    52/push-edx
<span id="L2138" class="LineNr">2138 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2139" class="LineNr">2139 </span>    e8/call  <a href='../077subx-words.subx.html#L535'>is-label?</a>/disp32
<span id="L2140" class="LineNr">2140 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2141" class="LineNr">2141 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L2142" class="LineNr">2142 </span>    <span class="subxS1Comment"># . if (eax != false) break</span>
<span id="L2143" class="LineNr">2143 </span>    3d/compare-eax-and  0/imm32/false
<span id="L2144" class="LineNr">2144 </span>    0f 85/jump-if-!=  $emit-segments:line-loop/disp32
<span id="L2145" class="LineNr">2145 </span><span class="Constant">$emit-segments:check-for-segment-header</span>:
<span id="L2146" class="LineNr">2146 </span>    <span class="subxComment"># if (slice-equal?(word-slice, &quot;==&quot;)) break</span>
<span id="L2147" class="LineNr">2147 </span>    <span class="subxS1Comment"># . eax = slice-equal?(word-slice, &quot;==&quot;)</span>
<span id="L2148" class="LineNr">2148 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2149" class="LineNr">2149 </span>    68/push  <span class="Constant">&quot;==&quot;</span>/imm32
<span id="L2150" class="LineNr">2150 </span>    52/push-edx
<span id="L2151" class="LineNr">2151 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2152" class="LineNr">2152 </span>    e8/call  <a href='../072slice.subx.html#L120'>slice-equal?</a>/disp32
<span id="L2153" class="LineNr">2153 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2154" class="LineNr">2154 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L2155" class="LineNr">2155 </span>    <span class="subxS1Comment"># . if (eax != false) break</span>
<span id="L2156" class="LineNr">2156 </span>    3d/compare-eax-and  0/imm32/false
<span id="L2157" class="LineNr">2157 </span>    0f 85/jump-if-!=  $emit-segments:line-loop/disp32
<span id="L2158" class="LineNr">2158 </span><span class="Constant">$emit-segments:2-character</span>:
<span id="L2159" class="LineNr">2159 </span>    <span class="subxComment"># if (length(word-slice) != 2) goto next check</span>
<span id="L2160" class="LineNr">2160 </span>    <span class="subxS1Comment"># . eax = length(word-slice)</span>
<span id="L2161" class="LineNr">2161 </span>    8b/copy                         1/mod/*+disp8   2/rm32/edx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(edx+4) to eax</span>
<span id="L2162" class="LineNr">2162 </span>    2b/subtract                     0/mod/indirect  2/rm32/edx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># subtract *edx from eax</span>
<span id="L2163" class="LineNr">2163 </span>    <span class="subxS1Comment"># . if (eax != 2) goto next check</span>
<span id="L2164" class="LineNr">2164 </span>    3d/compare-eax-and  2/imm32
<span id="L2165" class="LineNr">2165 </span>    75/jump-if-!=  $emit-segments:check-metadata/disp8
<span id="L2166" class="LineNr">2166 </span>    <span class="subxComment"># write-slice-buffered(out, word-slice)</span>
<span id="L2167" class="LineNr">2167 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2168" class="LineNr">2168 </span>    52/push-edx
<span id="L2169" class="LineNr">2169 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+12)</span>
<span id="L2170" class="LineNr">2170 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2171" class="LineNr">2171 </span>    e8/call  <a href='../072slice.subx.html#L909'>write-slice-buffered</a>/disp32
<span id="L2172" class="LineNr">2172 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2173" class="LineNr">2173 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L2174" class="LineNr">2174 </span>    <span class="subxComment"># write-buffered(out, &quot; &quot;)</span>
<span id="L2175" class="LineNr">2175 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2176" class="LineNr">2176 </span>    68/push  <span class="SpecialChar"><a href='../051test.subx.html#L94'>Space</a></span>/imm32
<span id="L2177" class="LineNr">2177 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+12)</span>
<span id="L2178" class="LineNr">2178 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2179" class="LineNr">2179 </span>    e8/call  <a href='../065write-buffered.subx.html#L8'>write-buffered</a>/disp32
<span id="L2180" class="LineNr">2180 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2181" class="LineNr">2181 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L2182" class="LineNr">2182 </span>    <span class="subxComment"># continue</span>
<span id="L2183" class="LineNr">2183 </span>    e9/jump  $emit-segments:word-loop/disp32
<span id="L2184" class="LineNr">2184 </span><span class="Constant">$emit-segments:check-metadata</span>:
<span id="L2185" class="LineNr">2185 </span>    <span class="subxH1Comment"># - if we get here, 'word-slice' must be a label to be looked up</span>
<span id="L2186" class="LineNr">2186 </span>    <span class="subxComment"># datum/edi = next-token-from-slice(word-slice-&gt;start, word-slice-&gt;end, &quot;/&quot;)</span>
<span id="L2187" class="LineNr">2187 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2188" class="LineNr">2188 </span>    57/push-edi
<span id="L2189" class="LineNr">2189 </span>    68/push  0x2f/imm32/slash
<span id="L2190" class="LineNr">2190 </span>    ff          6/subop/push        1/mod/*+disp8   2/rm32/edx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># push *(edx+4)</span>
<span id="L2191" class="LineNr">2191 </span>    ff          6/subop/push        0/mod/indirect  2/rm32/edx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># push *edx</span>
<span id="L2192" class="LineNr">2192 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2193" class="LineNr">2193 </span>    e8/call  <a href='../073next-token.subx.html#L163'>next-token-from-slice</a>/disp32
<span id="L2194" class="LineNr">2194 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2195" class="LineNr">2195 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x10/imm32        <span class="subxComment"># add to esp</span>
<span id="L2196" class="Folded">2196 </span><span class="Folded">+-- 33 lines: #?     # dump word-slice -----------------------------------------------------------------------------------------------------------------------</span>
<span id="L2229" class="LineNr">2229 </span>    <span class="subxComment"># info/esi = get-slice(labels, datum, row-size=16, &quot;label table&quot;)</span>
<span id="L2230" class="LineNr">2230 </span>    <span class="subxS1Comment"># . eax = get-slice(labels, datum, row-size=16, &quot;label table&quot;)</span>
<span id="L2231" class="LineNr">2231 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2232" class="LineNr">2232 </span>    68/push  <span class="Constant">&quot;label table&quot;</span>/imm32
<span id="L2233" class="LineNr">2233 </span>    68/push  0x10/imm32/row-size
<span id="L2234" class="LineNr">2234 </span>    57/push-edi
<span id="L2235" class="LineNr">2235 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0x14/disp8     <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+20)</span>
<span id="L2236" class="LineNr">2236 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2237" class="LineNr">2237 </span>    e8/call  <a href='../081table.subx.html#L201'>get-slice</a>/disp32
<span id="L2238" class="LineNr">2238 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2239" class="LineNr">2239 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x10/imm32        <span class="subxComment"># add to esp</span>
<span id="L2240" class="LineNr">2240 </span>    <span class="subxS1Comment"># . esi = eax</span>
<span id="L2241" class="LineNr">2241 </span>    89/copy                         3/mod/direct    6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy eax to esi</span>
<span id="L2242" class="LineNr">2242 </span><span class="Constant">$emit-segments:check-global-variable</span>:
<span id="L2243" class="Folded">2243 </span><span class="Folded">+-- 26 lines: #?     # dump info-&gt;segment-name ---------------------------------------------------------------------------------------------------------------</span>
<span id="L2269" class="LineNr">2269 </span>    <span class="subxComment"># if string-equal?(info-&gt;segment-name, &quot;code&quot;) goto code label checks</span>
<span id="L2270" class="LineNr">2270 </span>    <span class="subxS1Comment"># . eax = string-equal?(info-&gt;segment-name, &quot;code&quot;)</span>
<span id="L2271" class="LineNr">2271 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2272" class="LineNr">2272 </span>    68/push  <span class="Constant">&quot;code&quot;</span>/imm32
<span id="L2273" class="LineNr">2273 </span>    ff          6/subop/push        0/mod/indirect  6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># push *esi</span>
<span id="L2274" class="LineNr">2274 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2275" class="LineNr">2275 </span>    e8/call  <a href='../054string-equal.subx.html#L16'>string-equal?</a>/disp32
<span id="L2276" class="LineNr">2276 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2277" class="LineNr">2277 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L2278" class="LineNr">2278 </span>    <span class="subxS1Comment"># . if (eax != false) goto code label checks</span>
<span id="L2279" class="LineNr">2279 </span>    3d/compare-eax-and  0/imm32/false
<span id="L2280" class="LineNr">2280 </span>    0f 85/jump-if-!=  $emit-segments:check-code-label-for-imm8/disp32
<span id="L2281" class="LineNr">2281 </span><span class="Constant">$emit-segments:check-global-variable-for-disp8</span>:
<span id="L2282" class="LineNr">2282 </span>    <span class="subxComment"># if has-metadata?(word-slice, &quot;disp8&quot;) abort</span>
<span id="L2283" class="LineNr">2283 </span>    <span class="subxS1Comment"># . eax = has-metadata?(word-slice, &quot;disp8&quot;)</span>
<span id="L2284" class="LineNr">2284 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2285" class="LineNr">2285 </span>    68/push  <span class="Constant">&quot;disp8&quot;</span>/imm32
<span id="L2286" class="LineNr">2286 </span>    52/push-edx
<span id="L2287" class="LineNr">2287 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2288" class="LineNr">2288 </span>    e8/call  <a href='../077subx-words.subx.html#L8'>has-metadata?</a>/disp32
<span id="L2289" class="LineNr">2289 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2290" class="LineNr">2290 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L2291" class="LineNr">2291 </span>    <span class="subxS1Comment"># . if (eax != false) abort</span>
<span id="L2292" class="LineNr">2292 </span>    3d/compare-eax-and  0/imm32/false
<span id="L2293" class="LineNr">2293 </span>    0f 85/jump-if-!=  $emit-segments:global-variable-abort/disp32
<span id="L2294" class="LineNr">2294 </span><span class="Constant">$emit-segments:check-global-variable-for-imm8</span>:
<span id="L2295" class="LineNr">2295 </span>    <span class="subxComment"># if has-metadata?(word-slice, &quot;imm8&quot;) abort</span>
<span id="L2296" class="LineNr">2296 </span>    <span class="subxS1Comment"># . eax = has-metadata?(word-slice, &quot;imm8&quot;)</span>
<span id="L2297" class="LineNr">2297 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2298" class="LineNr">2298 </span>    68/push  <span class="Constant">&quot;imm8&quot;</span>/imm32
<span id="L2299" class="LineNr">2299 </span>    52/push-edx
<span id="L2300" class="LineNr">2300 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2301" class="LineNr">2301 </span>    e8/call  <a href='../077subx-words.subx.html#L8'>has-metadata?</a>/disp32
<span id="L2302" class="LineNr">2302 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2303" class="LineNr">2303 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L2304" class="LineNr">2304 </span>    <span class="subxS1Comment"># . if (eax != false) abort</span>
<span id="L2305" class="LineNr">2305 </span>    3d/compare-eax-and  0/imm32/false
<span id="L2306" class="LineNr">2306 </span>    0f 85/jump-if-!=  $emit-segments:global-variable-abort/disp32
<span id="L2307" class="LineNr">2307 </span><span class="Constant">$emit-segments:emit-global-variable</span>:
<span id="L2308" class="LineNr">2308 </span>    <span class="subxComment"># emit-hex(out, info-&gt;address, 4)</span>
<span id="L2309" class="LineNr">2309 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2310" class="LineNr">2310 </span>    68/push  4/imm32
<span id="L2311" class="LineNr">2311 </span>    ff          6/subop/push        1/mod/*+disp8   6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># push *(esi+8)</span>
<span id="L2312" class="LineNr">2312 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+12)</span>
<span id="L2313" class="LineNr">2313 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2314" class="LineNr">2314 </span>    e8/call  <a href='../078emit-hex.subx.html#L7'>emit-hex</a>/disp32
<span id="L2315" class="LineNr">2315 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2316" class="LineNr">2316 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L2317" class="LineNr">2317 </span>    <span class="subxComment"># continue</span>
<span id="L2318" class="LineNr">2318 </span>    e9/jump  $emit-segments:word-loop/disp32
<span id="L2319" class="LineNr">2319 </span><span class="Constant">$emit-segments:check-code-label-for-imm8</span>:
<span id="L2320" class="LineNr">2320 </span>    <span class="subxComment"># if (has-metadata?(word-slice, &quot;imm8&quot;)) abort</span>
<span id="L2321" class="LineNr">2321 </span>    <span class="subxS1Comment"># . eax = has-metadata?(edx, &quot;imm8&quot;)</span>
<span id="L2322" class="LineNr">2322 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2323" class="LineNr">2323 </span>    68/push  <span class="Constant">&quot;imm8&quot;</span>/imm32
<span id="L2324" class="LineNr">2324 </span>    52/push-edx
<span id="L2325" class="LineNr">2325 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2326" class="LineNr">2326 </span>    e8/call  <a href='../077subx-words.subx.html#L8'>has-metadata?</a>/disp32
<span id="L2327" class="LineNr">2327 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2328" class="LineNr">2328 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L2329" class="LineNr">2329 </span>    <span class="subxS1Comment"># . if (eax != false) abort</span>
<span id="L2330" class="LineNr">2330 </span>    3d/compare-eax-and  0/imm32/false
<span id="L2331" class="LineNr">2331 </span>    0f 85/jump-if-!=  $emit-segments:imm8-abort/disp32
<span id="L2332" class="LineNr">2332 </span><span class="Constant">$emit-segments:check-code-label-for-imm32</span>:
<span id="L2333" class="LineNr">2333 </span>    <span class="subxComment"># if (!has-metadata?(word-slice, &quot;imm32&quot;)) goto next check</span>
<span id="L2334" class="LineNr">2334 </span>    <span class="subxS1Comment"># . eax = has-metadata?(edx, &quot;imm32&quot;)</span>
<span id="L2335" class="LineNr">2335 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2336" class="LineNr">2336 </span>    68/push  <span class="Constant">&quot;imm32&quot;</span>/imm32
<span id="L2337" class="LineNr">2337 </span>    52/push-edx
<span id="L2338" class="LineNr">2338 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2339" class="LineNr">2339 </span>    e8/call  <a href='../077subx-words.subx.html#L8'>has-metadata?</a>/disp32
<span id="L2340" class="LineNr">2340 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2341" class="LineNr">2341 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L2342" class="LineNr">2342 </span>    <span class="subxS1Comment"># . if (eax == false) goto next check</span>
<span id="L2343" class="LineNr">2343 </span>    3d/compare-eax-and  0/imm32
<span id="L2344" class="LineNr">2344 </span>    74/jump-if-=  $emit-segments:check-code-label-for-disp8/disp8
<span id="L2345" class="Folded">2345 </span><span class="Folded">+-- 33 lines: #?     # dump info-&gt;address --------------------------------------------------------------------------------------------------------------------</span>
<span id="L2378" class="LineNr">2378 </span><span class="Constant">$emit-segments:emit-code-label-imm32</span>:
<span id="L2379" class="LineNr">2379 </span>    <span class="subxComment"># emit-hex(out, info-&gt;address, 4)</span>
<span id="L2380" class="LineNr">2380 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2381" class="LineNr">2381 </span>    68/push  4/imm32
<span id="L2382" class="LineNr">2382 </span>    ff          6/subop/push        1/mod/*+disp8   6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># push *(esi+8)</span>
<span id="L2383" class="LineNr">2383 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+12)</span>
<span id="L2384" class="LineNr">2384 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2385" class="LineNr">2385 </span>    e8/call  <a href='../078emit-hex.subx.html#L7'>emit-hex</a>/disp32
<span id="L2386" class="LineNr">2386 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2387" class="LineNr">2387 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L2388" class="LineNr">2388 </span>    <span class="subxComment"># continue</span>
<span id="L2389" class="LineNr">2389 </span>    e9/jump  $emit-segments:word-loop/disp32
<span id="L2390" class="LineNr">2390 </span><span class="Constant">$emit-segments:check-code-label-for-disp8</span>:
<span id="L2391" class="LineNr">2391 </span>    <span class="subxComment"># if (!has-metadata?(word-slice, &quot;disp8&quot;)) goto next check</span>
<span id="L2392" class="LineNr">2392 </span>    <span class="subxS1Comment"># . eax = has-metadata?(edx, &quot;disp8&quot;)</span>
<span id="L2393" class="LineNr">2393 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2394" class="LineNr">2394 </span>    68/push  <span class="Constant">&quot;disp8&quot;</span>/imm32
<span id="L2395" class="LineNr">2395 </span>    52/push-edx
<span id="L2396" class="LineNr">2396 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2397" class="LineNr">2397 </span>    e8/call  <a href='../077subx-words.subx.html#L8'>has-metadata?</a>/disp32
<span id="L2398" class="LineNr">2398 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2399" class="LineNr">2399 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L2400" class="LineNr">2400 </span>    <span class="subxS1Comment"># . if (eax == false) goto next check</span>
<span id="L2401" class="LineNr">2401 </span>    3d/compare-eax-and  0/imm32/false
<span id="L2402" class="LineNr">2402 </span>    74/jump-if-=  $emit-segments:check-code-label-for-disp32/disp8
<span id="L2403" class="LineNr">2403 </span><span class="Constant">$emit-segments:emit-code-label-disp8</span>:
<span id="L2404" class="LineNr">2404 </span>    <span class="subxComment"># emit-hex(out, info-&gt;offset - offset-of-next-instruction, 1)</span>
<span id="L2405" class="LineNr">2405 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2406" class="LineNr">2406 </span>    68/push  1/imm32
<span id="L2407" class="LineNr">2407 </span>    8b/copy                         1/mod/*+disp8   6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(esi+4) to eax</span>
<span id="L2408" class="LineNr">2408 </span>    29/subtract                     3/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          3/r32/ebx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># subtract ebx from eax</span>
<span id="L2409" class="LineNr">2409 </span>    50/push-eax
<span id="L2410" class="LineNr">2410 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+12)</span>
<span id="L2411" class="LineNr">2411 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2412" class="LineNr">2412 </span>    e8/call  <a href='../078emit-hex.subx.html#L7'>emit-hex</a>/disp32
<span id="L2413" class="LineNr">2413 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2414" class="LineNr">2414 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L2415" class="LineNr">2415 </span>    <span class="subxComment"># continue</span>
<span id="L2416" class="LineNr">2416 </span>    e9/jump  $emit-segments:word-loop/disp32
<span id="L2417" class="LineNr">2417 </span><span class="Constant">$emit-segments:check-code-label-for-disp32</span>:
<span id="L2418" class="LineNr">2418 </span>    <span class="subxComment"># if (!has-metadata?(word-slice, &quot;disp32&quot;)) abort</span>
<span id="L2419" class="LineNr">2419 </span>    <span class="subxS1Comment"># . eax = has-metadata?(edx, &quot;disp32&quot;)</span>
<span id="L2420" class="LineNr">2420 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2421" class="LineNr">2421 </span>    68/push  <span class="Constant">&quot;disp32&quot;</span>/imm32
<span id="L2422" class="LineNr">2422 </span>    52/push-edx
<span id="L2423" class="LineNr">2423 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2424" class="LineNr">2424 </span>    e8/call  <a href='../077subx-words.subx.html#L8'>has-metadata?</a>/disp32
<span id="L2425" class="LineNr">2425 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2426" class="LineNr">2426 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L2427" class="LineNr">2427 </span>    <span class="subxS1Comment"># . if (eax == false) abort</span>
<span id="L2428" class="LineNr">2428 </span>    3d/compare-eax-and  0/imm32/false
<span id="L2429" class="LineNr">2429 </span>    0f 84/jump-if-=  $emit-segments:abort/disp32
<span id="L2430" class="LineNr">2430 </span><span class="Constant">$emit-segments:emit-code-label-disp32</span>:
<span id="L2431" class="LineNr">2431 </span>    <span class="subxComment"># emit-hex(out, info-&gt;offset - offset-of-next-instruction, 4)</span>
<span id="L2432" class="LineNr">2432 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2433" class="LineNr">2433 </span>    68/push  4/imm32
<span id="L2434" class="LineNr">2434 </span>    8b/copy                         1/mod/*+disp8   6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(esi+4) to eax</span>
<span id="L2435" class="LineNr">2435 </span>    29/subtract                     3/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          3/r32/ebx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># subtract ebx from eax</span>
<span id="L2436" class="LineNr">2436 </span>    50/push-eax
<span id="L2437" class="LineNr">2437 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+12)</span>
<span id="L2438" class="LineNr">2438 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2439" class="LineNr">2439 </span>    e8/call  <a href='../078emit-hex.subx.html#L7'>emit-hex</a>/disp32
<span id="L2440" class="LineNr">2440 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2441" class="LineNr">2441 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L2442" class="LineNr">2442 </span>    <span class="subxComment"># continue</span>
<span id="L2443" class="LineNr">2443 </span>    e9/jump  $emit-segments:word-loop/disp32
<span id="L2444" class="LineNr">2444 </span><span class="Constant">$emit-segments:next-line</span>:
<span id="L2445" class="LineNr">2445 </span>    <span class="subxComment"># write-buffered(out, &quot;\n&quot;)</span>
<span id="L2446" class="LineNr">2446 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2447" class="LineNr">2447 </span>    68/push  <span class="SpecialChar"><a href='../051test.subx.html#L83'>Newline</a></span>/imm32
<span id="L2448" class="LineNr">2448 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+12)</span>
<span id="L2449" class="LineNr">2449 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2450" class="LineNr">2450 </span>    e8/call  <a href='../065write-buffered.subx.html#L8'>write-buffered</a>/disp32
<span id="L2451" class="LineNr">2451 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2452" class="LineNr">2452 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L2453" class="LineNr">2453 </span>    <span class="subxComment"># loop</span>
<span id="L2454" class="LineNr">2454 </span>    e9/jump  $emit-segments:line-loop/disp32
<span id="L2455" class="LineNr">2455 </span><span class="Constant">$emit-segments:end</span>:
<span id="L2456" class="LineNr">2456 </span>    <span class="subxS1Comment"># . reclaim locals</span>
<span id="L2457" class="LineNr">2457 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x21c/imm32       <span class="subxComment"># add to esp</span>
<span id="L2458" class="LineNr">2458 </span>    <span class="subxS1Comment"># . restore registers</span>
<span id="L2459" class="LineNr">2459 </span>    5f/pop-to-edi
<span id="L2460" class="LineNr">2460 </span>    5e/pop-to-esi
<span id="L2461" class="LineNr">2461 </span>    5b/pop-to-ebx
<span id="L2462" class="LineNr">2462 </span>    5a/pop-to-edx
<span id="L2463" class="LineNr">2463 </span>    59/pop-to-ecx
<span id="L2464" class="LineNr">2464 </span>    58/pop-to-eax
<span id="L2465" class="LineNr">2465 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L2466" class="LineNr">2466 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L2467" class="LineNr">2467 </span>    5d/pop-to-ebp
<span id="L2468" class="LineNr">2468 </span>    c3/return
<span id="L2469" class="LineNr">2469 </span>
<span id="L2470" class="LineNr">2470 </span><span class="Constant">$emit-segments:global-variable-abort</span>:
<span id="L2471" class="LineNr">2471 </span>    <span class="subxS1Comment"># . _write(2/stderr, error)</span>
<span id="L2472" class="LineNr">2472 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2473" class="LineNr">2473 </span>    68/push  <span class="Constant">&quot;emit-segments: must refer to global variables with /disp32 or /imm32&quot;</span>/imm32
<span id="L2474" class="LineNr">2474 </span>    68/push  2/imm32/stderr
<span id="L2475" class="LineNr">2475 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2476" class="LineNr">2476 </span>    e8/call  <a href='../050_write.subx.html#L14'>_write</a>/disp32
<span id="L2477" class="LineNr">2477 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2478" class="LineNr">2478 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L2479" class="LineNr">2479 </span>    <span class="subxS1Comment"># . syscall(exit, 1)</span>
<span id="L2480" class="LineNr">2480 </span>    bb/copy-to-ebx  1/imm32
<span id="L2481" class="LineNr">2481 </span>    b8/copy-to-eax  1/imm32/exit
<span id="L2482" class="LineNr">2482 </span>    cd/syscall  0x80/imm8
<span id="L2483" class="LineNr">2483 </span>    <span class="subxComment"># never gets here</span>
<span id="L2484" class="LineNr">2484 </span>
<span id="L2485" class="LineNr">2485 </span><span class="Constant">$emit-segments:imm8-abort</span>:
<span id="L2486" class="LineNr">2486 </span>    <span class="subxS1Comment"># . _write(2/stderr, error)</span>
<span id="L2487" class="LineNr">2487 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2488" class="LineNr">2488 </span>    68/push  <span class="Constant">&quot;emit-segments: cannot refer to code labels with /imm8&quot;</span>/imm32
<span id="L2489" class="LineNr">2489 </span>    68/push  2/imm32/stderr
<span id="L2490" class="LineNr">2490 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2491" class="LineNr">2491 </span>    e8/call  <a href='../050_write.subx.html#L14'>_write</a>/disp32
<span id="L2492" class="LineNr">2492 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2493" class="LineNr">2493 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L2494" class="LineNr">2494 </span>    <span class="subxS1Comment"># . syscall(exit, 1)</span>
<span id="L2495" class="LineNr">2495 </span>    bb/copy-to-ebx  1/imm32
<span id="L2496" class="LineNr">2496 </span>    b8/copy-to-eax  1/imm32/exit
<span id="L2497" class="LineNr">2497 </span>    cd/syscall  0x80/imm8
<span id="L2498" class="LineNr">2498 </span>    <span class="subxComment"># never gets here</span>
<span id="L2499" class="LineNr">2499 </span>
<span id="L2500" class="LineNr">2500 </span><span class="Constant">$emit-segments:abort</span>:
<span id="L2501" class="LineNr">2501 </span>    <span class="subxComment"># print(stderr, &quot;missing metadata in &quot; word-slice)</span>
<span id="L2502" class="LineNr">2502 </span>    <span class="subxS1Comment"># . _write(2/stderr, &quot;missing metadata in word &quot;)</span>
<span id="L2503" class="LineNr">2503 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2504" class="LineNr">2504 </span>    68/push  <span class="Constant">&quot;emit-segments: missing metadata in &quot;</span>/imm32
<span id="L2505" class="LineNr">2505 </span>    68/push  2/imm32/stderr
<span id="L2506" class="LineNr">2506 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2507" class="LineNr">2507 </span>    e8/call  <a href='../050_write.subx.html#L14'>_write</a>/disp32
<span id="L2508" class="LineNr">2508 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2509" class="LineNr">2509 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L2510" class="LineNr">2510 </span>    <span class="subxS1Comment"># . write-slice-buffered(Stderr, word-slice)</span>
<span id="L2511" class="LineNr">2511 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2512" class="LineNr">2512 </span>    52/push-edx
<span id="L2513" class="LineNr">2513 </span>    68/push  <span class="SpecialChar"><a href='../065write-buffered.subx.html#L209'>Stderr</a></span>/imm32
<span id="L2514" class="LineNr">2514 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2515" class="LineNr">2515 </span>    e8/call  <a href='../072slice.subx.html#L909'>write-slice-buffered</a>/disp32
<span id="L2516" class="LineNr">2516 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2517" class="LineNr">2517 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L2518" class="LineNr">2518 </span>    <span class="subxS1Comment"># . flush(Stderr)</span>
<span id="L2519" class="LineNr">2519 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2520" class="LineNr">2520 </span>    68/push  <span class="SpecialChar"><a href='../065write-buffered.subx.html#L209'>Stderr</a></span>/imm32
<span id="L2521" class="LineNr">2521 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2522" class="LineNr">2522 </span>    e8/call  <a href='../064write-byte.subx.html#L81'>flush</a>/disp32
<span id="L2523" class="LineNr">2523 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2524" class="LineNr">2524 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L2525" class="LineNr">2525 </span>    <span class="subxS1Comment"># . syscall(exit, 1)</span>
<span id="L2526" class="LineNr">2526 </span>    bb/copy-to-ebx  1/imm32
<span id="L2527" class="LineNr">2527 </span>    b8/copy-to-eax  1/imm32/exit
<span id="L2528" class="LineNr">2528 </span>    cd/syscall  0x80/imm8
<span id="L2529" class="LineNr">2529 </span>    <span class="subxComment"># never gets here</span>
<span id="L2530" class="LineNr">2530 </span>
<span id="L2531" class="LineNr">2531 </span><span class="subxTest">test-emit-segments-global-variable</span>:
<span id="L2532" class="LineNr">2532 </span>    <span class="subxComment"># global variables always convert to absolute addresses, regardless of metadata</span>
<span id="L2533" class="LineNr">2533 </span>    <span class="subxComment">#</span>
<span id="L2534" class="LineNr">2534 </span>    <span class="subxComment"># input:</span>
<span id="L2535" class="LineNr">2535 </span>    <span class="subxComment">#   in:</span>
<span id="L2536" class="LineNr">2536 </span>    <span class="subxComment">#     == code 0x1000</span>
<span id="L2537" class="LineNr">2537 </span>    <span class="subxComment">#     ab cd ef gh</span>
<span id="L2538" class="LineNr">2538 </span>    <span class="subxComment">#     ij x/disp32</span>
<span id="L2539" class="LineNr">2539 </span>    <span class="subxComment">#     == data 0x2000</span>
<span id="L2540" class="LineNr">2540 </span>    <span class="subxComment">#     00</span>
<span id="L2541" class="LineNr">2541 </span>    <span class="subxComment">#     x:</span>
<span id="L2542" class="LineNr">2542 </span>    <span class="subxComment">#       34</span>
<span id="L2543" class="LineNr">2543 </span>    <span class="subxComment">#   segments:</span>
<span id="L2544" class="LineNr">2544 </span>    <span class="subxComment">#     - 'code': {0x1074, 0, 9}</span>
<span id="L2545" class="LineNr">2545 </span>    <span class="subxComment">#     - 'data': {0x2079, 5, 2}</span>
<span id="L2546" class="LineNr">2546 </span>    <span class="subxComment">#   labels:</span>
<span id="L2547" class="LineNr">2547 </span>    <span class="subxComment">#     - 'x': {'data', 1, 0x207a}</span>
<span id="L2548" class="LineNr">2548 </span>    <span class="subxComment">#</span>
<span id="L2549" class="LineNr">2549 </span>    <span class="subxComment"># output:</span>
<span id="L2550" class="LineNr">2550 </span>    <span class="subxComment">#   ab cd ef gh</span>
<span id="L2551" class="LineNr">2551 </span>    <span class="subxComment">#   ij 7a 20 00 00</span>
<span id="L2552" class="LineNr">2552 </span>    <span class="subxComment">#   00</span>
<span id="L2553" class="LineNr">2553 </span>    <span class="subxComment">#   34</span>
<span id="L2554" class="LineNr">2554 </span>    <span class="subxComment">#</span>
<span id="L2555" class="LineNr">2555 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L2556" class="LineNr">2556 </span>    55/push-ebp
<span id="L2557" class="LineNr">2557 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L2558" class="LineNr">2558 </span>    <span class="subxComment"># setup</span>
<span id="L2559" class="LineNr">2559 </span>    <span class="subxS1Comment"># . clear-stream(_test-input-stream)</span>
<span id="L2560" class="LineNr">2560 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2561" class="LineNr">2561 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L2562" class="LineNr">2562 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2563" class="LineNr">2563 </span>    e8/call  <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L2564" class="LineNr">2564 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2565" class="LineNr">2565 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L2566" class="LineNr">2566 </span>    <span class="subxS1Comment"># . clear-stream(_test-output-stream)</span>
<span id="L2567" class="LineNr">2567 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2568" class="LineNr">2568 </span>    68/push  <a href='../064write-byte.subx.html#L286'>_test-output-stream</a>/imm32
<span id="L2569" class="LineNr">2569 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2570" class="LineNr">2570 </span>    e8/call  <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L2571" class="LineNr">2571 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2572" class="LineNr">2572 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L2573" class="LineNr">2573 </span>    <span class="subxS1Comment"># . clear-stream($_test-output-buffered-file-&gt;buffer)</span>
<span id="L2574" class="LineNr">2574 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2575" class="LineNr">2575 </span>    68/push  $_test-output-buffered-file-&gt;buffer/imm32
<span id="L2576" class="LineNr">2576 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2577" class="LineNr">2577 </span>    e8/call  <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L2578" class="LineNr">2578 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2579" class="LineNr">2579 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L2580" class="LineNr">2580 </span>    <span class="subxS1Comment"># . var segments/ecx : (stream byte 10*16)</span>
<span id="L2581" class="LineNr">2581 </span>    81          5/subop/subtract    3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xa0/imm32        <span class="subxComment"># subtract from esp</span>
<span id="L2582" class="LineNr">2582 </span>    68/push  0xa0/imm32/length
<span id="L2583" class="LineNr">2583 </span>    68/push  0/imm32/read
<span id="L2584" class="LineNr">2584 </span>    68/push  0/imm32/write
<span id="L2585" class="LineNr">2585 </span>    89/copy                         3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ecx</span>
<span id="L2586" class="LineNr">2586 </span>    <span class="subxS1Comment"># . var labels/edx : (stream byte 512*16)</span>
<span id="L2587" class="LineNr">2587 </span>    81          5/subop/subtract    3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x2000/imm32      <span class="subxComment"># subtract from esp</span>
<span id="L2588" class="LineNr">2588 </span>    68/push  0x2000/imm32/length
<span id="L2589" class="LineNr">2589 </span>    68/push  0/imm32/read
<span id="L2590" class="LineNr">2590 </span>    68/push  0/imm32/write
<span id="L2591" class="LineNr">2591 </span>    89/copy                         3/mod/direct    2/rm32/edx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to edx</span>
<span id="L2592" class="LineNr">2592 </span>    <span class="subxComment"># initialize input</span>
<span id="L2593" class="LineNr">2593 </span>    <span class="subxS1Comment"># . write(_test-input-stream, &quot;== code 0x1000\n&quot;)</span>
<span id="L2594" class="LineNr">2594 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2595" class="LineNr">2595 </span>    68/push  <span class="Constant">&quot;== code 0x1000\n&quot;</span>/imm32
<span id="L2596" class="LineNr">2596 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L2597" class="LineNr">2597 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2598" class="LineNr">2598 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L2599" class="LineNr">2599 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2600" class="LineNr">2600 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L2601" class="LineNr">2601 </span>    <span class="subxS1Comment"># . write(_test-input-stream, &quot;ab cd ef gh\n&quot;)</span>
<span id="L2602" class="LineNr">2602 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2603" class="LineNr">2603 </span>    68/push  <span class="Constant">&quot;ab cd ef gh\n&quot;</span>/imm32
<span id="L2604" class="LineNr">2604 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L2605" class="LineNr">2605 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2606" class="LineNr">2606 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L2607" class="LineNr">2607 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2608" class="LineNr">2608 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L2609" class="LineNr">2609 </span>    <span class="subxS1Comment"># . write(_test-input-stream, &quot;ij x/disp32\n&quot;)</span>
<span id="L2610" class="LineNr">2610 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2611" class="LineNr">2611 </span>    68/push  <span class="Constant">&quot;ij x/disp32\n&quot;</span>/imm32
<span id="L2612" class="LineNr">2612 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L2613" class="LineNr">2613 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2614" class="LineNr">2614 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L2615" class="LineNr">2615 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2616" class="LineNr">2616 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L2617" class="LineNr">2617 </span>    <span class="subxS1Comment"># . write(_test-input-stream, &quot;== data 0x2000\n&quot;)</span>
<span id="L2618" class="LineNr">2618 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2619" class="LineNr">2619 </span>    68/push  <span class="Constant">&quot;== data 0x2000\n&quot;</span>/imm32
<span id="L2620" class="LineNr">2620 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L2621" class="LineNr">2621 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2622" class="LineNr">2622 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L2623" class="LineNr">2623 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2624" class="LineNr">2624 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L2625" class="LineNr">2625 </span>    <span class="subxS1Comment"># . write(_test-input-stream, &quot;00\n&quot;)</span>
<span id="L2626" class="LineNr">2626 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2627" class="LineNr">2627 </span>    68/push  <span class="Constant">&quot;00\n&quot;</span>/imm32
<span id="L2628" class="LineNr">2628 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L2629" class="LineNr">2629 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2630" class="LineNr">2630 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L2631" class="LineNr">2631 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2632" class="LineNr">2632 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L2633" class="LineNr">2633 </span>    <span class="subxS1Comment"># . write(_test-input-stream, &quot;x:\n&quot;)</span>
<span id="L2634" class="LineNr">2634 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2635" class="LineNr">2635 </span>    68/push  <span class="Constant">&quot;x:\n&quot;</span>/imm32
<span id="L2636" class="LineNr">2636 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L2637" class="LineNr">2637 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2638" class="LineNr">2638 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L2639" class="LineNr">2639 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2640" class="LineNr">2640 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L2641" class="LineNr">2641 </span>    <span class="subxS1Comment"># . write(_test-input-stream, &quot;34\n&quot;)</span>
<span id="L2642" class="LineNr">2642 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2643" class="LineNr">2643 </span>    68/push  <span class="Constant">&quot;34\n&quot;</span>/imm32
<span id="L2644" class="LineNr">2644 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L2645" class="LineNr">2645 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2646" class="LineNr">2646 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L2647" class="LineNr">2647 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2648" class="LineNr">2648 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L2649" class="LineNr">2649 </span>    <span class="subxS1Comment"># . stream-add4(segments, &quot;code&quot;, 0x1074, 0, 9)</span>
<span id="L2650" class="LineNr">2650 </span>    68/push  9/imm32/segment-size
<span id="L2651" class="LineNr">2651 </span>    68/push  0/imm32/file-offset
<span id="L2652" class="LineNr">2652 </span>    68/push  0x1074/imm32/start-address
<span id="L2653" class="LineNr">2653 </span>    68/push  <span class="Constant">&quot;code&quot;</span>/imm32/segment-name
<span id="L2654" class="LineNr">2654 </span>    51/push-ecx
<span id="L2655" class="LineNr">2655 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2656" class="LineNr">2656 </span>    e8/call  <a href='survey.subx.html#L3471'>stream-add4</a>/disp32
<span id="L2657" class="LineNr">2657 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2658" class="LineNr">2658 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x14/imm32        <span class="subxComment"># add to esp</span>
<span id="L2659" class="LineNr">2659 </span>    <span class="subxS1Comment"># . stream-add4(segments, &quot;data&quot;, 0x2079, 5, 2)</span>
<span id="L2660" class="LineNr">2660 </span>    68/push  1/imm32/segment-size
<span id="L2661" class="LineNr">2661 </span>    68/push  5/imm32/file-offset
<span id="L2662" class="LineNr">2662 </span>    68/push  0x2079/imm32/start-address
<span id="L2663" class="LineNr">2663 </span>    68/push  <span class="Constant">&quot;data&quot;</span>/imm32/segment-name
<span id="L2664" class="LineNr">2664 </span>    51/push-ecx
<span id="L2665" class="LineNr">2665 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2666" class="LineNr">2666 </span>    e8/call  <a href='survey.subx.html#L3471'>stream-add4</a>/disp32
<span id="L2667" class="LineNr">2667 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2668" class="LineNr">2668 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x14/imm32        <span class="subxComment"># add to esp</span>
<span id="L2669" class="LineNr">2669 </span>    <span class="subxS1Comment"># . stream-add4(labels, &quot;x&quot;, &quot;data&quot;, 1, 0x207a)</span>
<span id="L2670" class="LineNr">2670 </span>    68/push  0x207a/imm32/label-address
<span id="L2671" class="LineNr">2671 </span>    68/push  1/imm32/segment-offset
<span id="L2672" class="LineNr">2672 </span>    68/push  <span class="Constant">&quot;data&quot;</span>/imm32/segment-name
<span id="L2673" class="LineNr">2673 </span>    68/push  <span class="Constant">&quot;x&quot;</span>/imm32/label-name
<span id="L2674" class="LineNr">2674 </span>    52/push-edx
<span id="L2675" class="LineNr">2675 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2676" class="LineNr">2676 </span>    e8/call  <a href='survey.subx.html#L3471'>stream-add4</a>/disp32
<span id="L2677" class="LineNr">2677 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2678" class="LineNr">2678 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x14/imm32        <span class="subxComment"># add to esp</span>
<span id="L2679" class="LineNr">2679 </span>    <span class="subxComment"># component under test</span>
<span id="L2680" class="LineNr">2680 </span>    <span class="subxS1Comment"># . emit-segments(_test-input-stream, _test-output-buffered-file, segments, labels)</span>
<span id="L2681" class="LineNr">2681 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2682" class="LineNr">2682 </span>    52/push-edx
<span id="L2683" class="LineNr">2683 </span>    51/push-ecx
<span id="L2684" class="LineNr">2684 </span>    68/push  <a href='../064write-byte.subx.html#L328'>_test-output-buffered-file</a>/imm32
<span id="L2685" class="LineNr">2685 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L2686" class="LineNr">2686 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2687" class="LineNr">2687 </span>    e8/call  <a href='survey.subx.html#L1925'>emit-segments</a>/disp32
<span id="L2688" class="LineNr">2688 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2689" class="LineNr">2689 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x10/imm32        <span class="subxComment"># add to esp</span>
<span id="L2690" class="LineNr">2690 </span>    <span class="subxComment"># checks</span>
<span id="L2691" class="LineNr">2691 </span>    <span class="subxS1Comment"># . flush(_test-output-buffered-file)</span>
<span id="L2692" class="LineNr">2692 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2693" class="LineNr">2693 </span>    68/push  <a href='../064write-byte.subx.html#L328'>_test-output-buffered-file</a>/imm32
<span id="L2694" class="LineNr">2694 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2695" class="LineNr">2695 </span>    e8/call  <a href='../064write-byte.subx.html#L81'>flush</a>/disp32
<span id="L2696" class="LineNr">2696 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2697" class="LineNr">2697 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L2698" class="Folded">2698 </span><span class="Folded">+-- 33 lines: #?     # dump output ---------------------------------------------------------------------------------------------------------------------------</span>
<span id="L2731" class="LineNr">2731 </span>    <span class="subxS1Comment"># . check-next-stream-line-equal(_test-output-stream, &quot;ab cd ef gh &quot;, msg)</span>
<span id="L2732" class="LineNr">2732 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2733" class="LineNr">2733 </span>    68/push  <span class="Constant">&quot;F - <a href='survey.subx.html#L2531'>test-emit-segments-global-variable</a>/0&quot;</span>/imm32
<span id="L2734" class="LineNr">2734 </span>    68/push  <span class="Constant">&quot;ab cd ef gh &quot;</span>/imm32
<span id="L2735" class="LineNr">2735 </span>    68/push  <a href='../064write-byte.subx.html#L286'>_test-output-stream</a>/imm32
<span id="L2736" class="LineNr">2736 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2737" class="LineNr">2737 </span>    e8/call  <a href='../058stream-equal.subx.html#L565'>check-next-stream-line-equal</a>/disp32
<span id="L2738" class="LineNr">2738 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2739" class="LineNr">2739 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L2740" class="LineNr">2740 </span>    <span class="subxS1Comment"># . check-next-stream-line-equal(_test-output-stream, &quot;ij 7a 20 00 00 &quot;, msg)</span>
<span id="L2741" class="LineNr">2741 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2742" class="LineNr">2742 </span>    68/push  <span class="Constant">&quot;F - <a href='survey.subx.html#L2531'>test-emit-segments-global-variable</a>/1&quot;</span>/imm32
<span id="L2743" class="LineNr">2743 </span>    68/push  <span class="Constant">&quot;ij 7a 20 00 00 &quot;</span>/imm32
<span id="L2744" class="LineNr">2744 </span>    68/push  <a href='../064write-byte.subx.html#L286'>_test-output-stream</a>/imm32
<span id="L2745" class="LineNr">2745 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2746" class="LineNr">2746 </span>    e8/call  <a href='../058stream-equal.subx.html#L565'>check-next-stream-line-equal</a>/disp32
<span id="L2747" class="LineNr">2747 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2748" class="LineNr">2748 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L2749" class="LineNr">2749 </span>    <span class="subxS1Comment"># . check-next-stream-line-equal(_test-output-stream, &quot;00 &quot;, msg)</span>
<span id="L2750" class="LineNr">2750 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2751" class="LineNr">2751 </span>    68/push  <span class="Constant">&quot;F - <a href='survey.subx.html#L2531'>test-emit-segments-global-variable</a>/2&quot;</span>/imm32
<span id="L2752" class="LineNr">2752 </span>    68/push  <span class="Constant">&quot;00 &quot;</span>/imm32
<span id="L2753" class="LineNr">2753 </span>    68/push  <a href='../064write-byte.subx.html#L286'>_test-output-stream</a>/imm32
<span id="L2754" class="LineNr">2754 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2755" class="LineNr">2755 </span>    e8/call  <a href='../058stream-equal.subx.html#L565'>check-next-stream-line-equal</a>/disp32
<span id="L2756" class="LineNr">2756 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2757" class="LineNr">2757 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L2758" class="LineNr">2758 </span>    <span class="subxS1Comment"># . check-next-stream-line-equal(_test-output-stream, &quot;34 &quot;, msg)</span>
<span id="L2759" class="LineNr">2759 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2760" class="LineNr">2760 </span>    68/push  <span class="Constant">&quot;F - <a href='survey.subx.html#L2531'>test-emit-segments-global-variable</a>/3&quot;</span>/imm32
<span id="L2761" class="LineNr">2761 </span>    68/push  <span class="Constant">&quot;34 &quot;</span>/imm32
<span id="L2762" class="LineNr">2762 </span>    68/push  <a href='../064write-byte.subx.html#L286'>_test-output-stream</a>/imm32
<span id="L2763" class="LineNr">2763 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2764" class="LineNr">2764 </span>    e8/call  <a href='../058stream-equal.subx.html#L565'>check-next-stream-line-equal</a>/disp32
<span id="L2765" class="LineNr">2765 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2766" class="LineNr">2766 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L2767" class="LineNr">2767 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L2768" class="LineNr">2768 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L2769" class="LineNr">2769 </span>    5d/pop-to-ebp
<span id="L2770" class="LineNr">2770 </span>    c3/return
<span id="L2771" class="LineNr">2771 </span>
<span id="L2772" class="LineNr">2772 </span><span class="subxTest">test-emit-segments-code-label</span>:
<span id="L2773" class="LineNr">2773 </span>    <span class="subxComment"># labels usually convert to displacements</span>
<span id="L2774" class="LineNr">2774 </span>    <span class="subxComment">#</span>
<span id="L2775" class="LineNr">2775 </span>    <span class="subxComment"># input:</span>
<span id="L2776" class="LineNr">2776 </span>    <span class="subxComment">#   in:</span>
<span id="L2777" class="LineNr">2777 </span>    <span class="subxComment">#     == code 0x1000</span>
<span id="L2778" class="LineNr">2778 </span>    <span class="subxComment">#     ab cd</span>
<span id="L2779" class="LineNr">2779 </span>    <span class="subxComment">#     l1:</span>
<span id="L2780" class="LineNr">2780 </span>    <span class="subxComment">#       ef gh</span>
<span id="L2781" class="LineNr">2781 </span>    <span class="subxComment">#       ij l1/disp32</span>
<span id="L2782" class="LineNr">2782 </span>    <span class="subxComment">#   segments:</span>
<span id="L2783" class="LineNr">2783 </span>    <span class="subxComment">#     - 'code': {0x1054, 0, 9}</span>
<span id="L2784" class="LineNr">2784 </span>    <span class="subxComment">#   labels:</span>
<span id="L2785" class="LineNr">2785 </span>    <span class="subxComment">#     - 'l1': {'code', 2, 0x1056}</span>
<span id="L2786" class="LineNr">2786 </span>    <span class="subxComment">#</span>
<span id="L2787" class="LineNr">2787 </span>    <span class="subxComment"># output:</span>
<span id="L2788" class="LineNr">2788 </span>    <span class="subxComment">#   ab cd</span>
<span id="L2789" class="LineNr">2789 </span>    <span class="subxComment">#   ef gh</span>
<span id="L2790" class="LineNr">2790 </span>    <span class="subxComment">#   ij f9 ff ff ff  # -7</span>
<span id="L2791" class="LineNr">2791 </span>    <span class="subxComment">#</span>
<span id="L2792" class="LineNr">2792 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L2793" class="LineNr">2793 </span>    55/push-ebp
<span id="L2794" class="LineNr">2794 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L2795" class="LineNr">2795 </span>    <span class="subxComment"># setup</span>
<span id="L2796" class="LineNr">2796 </span>    <span class="subxS1Comment"># . clear-stream(_test-input-stream)</span>
<span id="L2797" class="LineNr">2797 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2798" class="LineNr">2798 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L2799" class="LineNr">2799 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2800" class="LineNr">2800 </span>    e8/call  <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L2801" class="LineNr">2801 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2802" class="LineNr">2802 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L2803" class="LineNr">2803 </span>    <span class="subxS1Comment"># . clear-stream(_test-output-stream)</span>
<span id="L2804" class="LineNr">2804 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2805" class="LineNr">2805 </span>    68/push  <a href='../064write-byte.subx.html#L286'>_test-output-stream</a>/imm32
<span id="L2806" class="LineNr">2806 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2807" class="LineNr">2807 </span>    e8/call  <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L2808" class="LineNr">2808 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2809" class="LineNr">2809 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L2810" class="LineNr">2810 </span>    <span class="subxS1Comment"># . clear-stream($_test-output-buffered-file-&gt;buffer)</span>
<span id="L2811" class="LineNr">2811 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2812" class="LineNr">2812 </span>    68/push  $_test-output-buffered-file-&gt;buffer/imm32
<span id="L2813" class="LineNr">2813 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2814" class="LineNr">2814 </span>    e8/call  <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L2815" class="LineNr">2815 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2816" class="LineNr">2816 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L2817" class="LineNr">2817 </span>    <span class="subxS1Comment"># . var segments/ecx : (stream byte 10*16)</span>
<span id="L2818" class="LineNr">2818 </span>    81          5/subop/subtract    3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xa0/imm32        <span class="subxComment"># subtract from esp</span>
<span id="L2819" class="LineNr">2819 </span>    68/push  0xa0/imm32/length
<span id="L2820" class="LineNr">2820 </span>    68/push  0/imm32/read
<span id="L2821" class="LineNr">2821 </span>    68/push  0/imm32/write
<span id="L2822" class="LineNr">2822 </span>    89/copy                         3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ecx</span>
<span id="L2823" class="LineNr">2823 </span>    <span class="subxS1Comment"># . var labels/edx : (stream byte 512*16)</span>
<span id="L2824" class="LineNr">2824 </span>    81          5/subop/subtract    3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x2000/imm32      <span class="subxComment"># subtract from esp</span>
<span id="L2825" class="LineNr">2825 </span>    68/push  0x2000/imm32/length
<span id="L2826" class="LineNr">2826 </span>    68/push  0/imm32/read
<span id="L2827" class="LineNr">2827 </span>    68/push  0/imm32/write
<span id="L2828" class="LineNr">2828 </span>    89/copy                         3/mod/direct    2/rm32/edx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to edx</span>
<span id="L2829" class="LineNr">2829 </span>    <span class="subxComment"># initialize input</span>
<span id="L2830" class="LineNr">2830 </span>    <span class="subxS1Comment"># . write(_test-input-stream, &quot;== code 0x1000\n&quot;)</span>
<span id="L2831" class="LineNr">2831 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2832" class="LineNr">2832 </span>    68/push  <span class="Constant">&quot;== code 0x1000\n&quot;</span>/imm32
<span id="L2833" class="LineNr">2833 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L2834" class="LineNr">2834 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2835" class="LineNr">2835 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L2836" class="LineNr">2836 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2837" class="LineNr">2837 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L2838" class="LineNr">2838 </span>    <span class="subxS1Comment"># . write(_test-input-stream, &quot;ab cd\n&quot;)</span>
<span id="L2839" class="LineNr">2839 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2840" class="LineNr">2840 </span>    68/push  <span class="Constant">&quot;ab cd\n&quot;</span>/imm32
<span id="L2841" class="LineNr">2841 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L2842" class="LineNr">2842 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2843" class="LineNr">2843 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L2844" class="LineNr">2844 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2845" class="LineNr">2845 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L2846" class="LineNr">2846 </span>    <span class="subxS1Comment"># . write(_test-input-stream, &quot;l1:\n&quot;)</span>
<span id="L2847" class="LineNr">2847 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2848" class="LineNr">2848 </span>    68/push  <span class="Constant">&quot;l1:\n&quot;</span>/imm32
<span id="L2849" class="LineNr">2849 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L2850" class="LineNr">2850 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2851" class="LineNr">2851 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L2852" class="LineNr">2852 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2853" class="LineNr">2853 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L2854" class="LineNr">2854 </span>    <span class="subxS1Comment"># . write(_test-input-stream, &quot;  ef gh\n&quot;)</span>
<span id="L2855" class="LineNr">2855 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2856" class="LineNr">2856 </span>    68/push  <span class="Constant">&quot;  ef gh\n&quot;</span>/imm32
<span id="L2857" class="LineNr">2857 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L2858" class="LineNr">2858 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2859" class="LineNr">2859 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L2860" class="LineNr">2860 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2861" class="LineNr">2861 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L2862" class="LineNr">2862 </span>    <span class="subxS1Comment"># . write(_test-input-stream, &quot;  ij l1/disp32\n&quot;)</span>
<span id="L2863" class="LineNr">2863 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2864" class="LineNr">2864 </span>    68/push  <span class="Constant">&quot;  ij l1/disp32\n&quot;</span>/imm32
<span id="L2865" class="LineNr">2865 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L2866" class="LineNr">2866 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2867" class="LineNr">2867 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L2868" class="LineNr">2868 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2869" class="LineNr">2869 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L2870" class="LineNr">2870 </span>    <span class="subxS1Comment"># . stream-add4(segments, &quot;code&quot;, 0x1054, 0, 9)</span>
<span id="L2871" class="LineNr">2871 </span>    68/push  9/imm32/segment-size
<span id="L2872" class="LineNr">2872 </span>    68/push  0/imm32/file-offset
<span id="L2873" class="LineNr">2873 </span>    68/push  0x1054/imm32/start-address
<span id="L2874" class="LineNr">2874 </span>    68/push  <span class="Constant">&quot;code&quot;</span>/imm32/segment-name
<span id="L2875" class="LineNr">2875 </span>    51/push-ecx
<span id="L2876" class="LineNr">2876 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2877" class="LineNr">2877 </span>    e8/call  <a href='survey.subx.html#L3471'>stream-add4</a>/disp32
<span id="L2878" class="LineNr">2878 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2879" class="LineNr">2879 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x14/imm32        <span class="subxComment"># add to esp</span>
<span id="L2880" class="LineNr">2880 </span>    <span class="subxS1Comment"># . stream-add4(labels, &quot;l1&quot;, &quot;code&quot;, 2, 0x1056)</span>
<span id="L2881" class="LineNr">2881 </span>    68/push  0x1056/imm32/label-address
<span id="L2882" class="LineNr">2882 </span>    68/push  2/imm32/segment-offset
<span id="L2883" class="LineNr">2883 </span>    68/push  <span class="Constant">&quot;code&quot;</span>/imm32/segment-name
<span id="L2884" class="LineNr">2884 </span>    68/push  <span class="Constant">&quot;l1&quot;</span>/imm32/label-name
<span id="L2885" class="LineNr">2885 </span>    52/push-edx
<span id="L2886" class="LineNr">2886 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2887" class="LineNr">2887 </span>    e8/call  <a href='survey.subx.html#L3471'>stream-add4</a>/disp32
<span id="L2888" class="LineNr">2888 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2889" class="LineNr">2889 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x14/imm32        <span class="subxComment"># add to esp</span>
<span id="L2890" class="LineNr">2890 </span>    <span class="subxComment"># component under test</span>
<span id="L2891" class="LineNr">2891 </span>    <span class="subxS1Comment"># . emit-segments(_test-input-stream, _test-output-buffered-file, segments, labels)</span>
<span id="L2892" class="LineNr">2892 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2893" class="LineNr">2893 </span>    52/push-edx
<span id="L2894" class="LineNr">2894 </span>    51/push-ecx
<span id="L2895" class="LineNr">2895 </span>    68/push  <a href='../064write-byte.subx.html#L328'>_test-output-buffered-file</a>/imm32
<span id="L2896" class="LineNr">2896 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L2897" class="LineNr">2897 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2898" class="LineNr">2898 </span>    e8/call  <a href='survey.subx.html#L1925'>emit-segments</a>/disp32
<span id="L2899" class="LineNr">2899 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2900" class="LineNr">2900 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x10/imm32        <span class="subxComment"># add to esp</span>
<span id="L2901" class="LineNr">2901 </span>    <span class="subxComment"># checks</span>
<span id="L2902" class="LineNr">2902 </span>    <span class="subxS1Comment"># . flush(_test-output-buffered-file)</span>
<span id="L2903" class="LineNr">2903 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2904" class="LineNr">2904 </span>    68/push  <a href='../064write-byte.subx.html#L328'>_test-output-buffered-file</a>/imm32
<span id="L2905" class="LineNr">2905 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2906" class="LineNr">2906 </span>    e8/call  <a href='../064write-byte.subx.html#L81'>flush</a>/disp32
<span id="L2907" class="LineNr">2907 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2908" class="LineNr">2908 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L2909" class="Folded">2909 </span><span class="Folded">+-- 33 lines: #?     # dump output ---------------------------------------------------------------------------------------------------------------------------</span>
<span id="L2942" class="LineNr">2942 </span>    <span class="subxS1Comment"># . check-next-stream-line-equal(_test-output-stream, &quot;ab cd &quot;, msg)</span>
<span id="L2943" class="LineNr">2943 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2944" class="LineNr">2944 </span>    68/push  <span class="Constant">&quot;F - <a href='survey.subx.html#L2772'>test-emit-segments-code-label</a>/0&quot;</span>/imm32
<span id="L2945" class="LineNr">2945 </span>    68/push  <span class="Constant">&quot;ab cd &quot;</span>/imm32
<span id="L2946" class="LineNr">2946 </span>    68/push  <a href='../064write-byte.subx.html#L286'>_test-output-stream</a>/imm32
<span id="L2947" class="LineNr">2947 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2948" class="LineNr">2948 </span>    e8/call  <a href='../058stream-equal.subx.html#L565'>check-next-stream-line-equal</a>/disp32
<span id="L2949" class="LineNr">2949 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2950" class="LineNr">2950 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L2951" class="LineNr">2951 </span>    <span class="subxS1Comment"># . check-next-stream-line-equal(_test-output-stream, &quot;ef gh &quot;, msg)</span>
<span id="L2952" class="LineNr">2952 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2953" class="LineNr">2953 </span>    68/push  <span class="Constant">&quot;F - <a href='survey.subx.html#L2772'>test-emit-segments-code-label</a>/1&quot;</span>/imm32
<span id="L2954" class="LineNr">2954 </span>    68/push  <span class="Constant">&quot;ef gh &quot;</span>/imm32
<span id="L2955" class="LineNr">2955 </span>    68/push  <a href='../064write-byte.subx.html#L286'>_test-output-stream</a>/imm32
<span id="L2956" class="LineNr">2956 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2957" class="LineNr">2957 </span>    e8/call  <a href='../058stream-equal.subx.html#L565'>check-next-stream-line-equal</a>/disp32
<span id="L2958" class="LineNr">2958 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2959" class="LineNr">2959 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L2960" class="LineNr">2960 </span>    <span class="subxS1Comment"># . check-next-stream-line-equal(_test-output-stream, &quot;ij f9 ff ff ff &quot;, msg)</span>
<span id="L2961" class="LineNr">2961 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L2962" class="LineNr">2962 </span>    68/push  <span class="Constant">&quot;F - <a href='survey.subx.html#L2772'>test-emit-segments-code-label</a>/2&quot;</span>/imm32
<span id="L2963" class="LineNr">2963 </span>    68/push  <span class="Constant">&quot;ij f9 ff ff ff &quot;</span>/imm32
<span id="L2964" class="LineNr">2964 </span>    68/push  <a href='../064write-byte.subx.html#L286'>_test-output-stream</a>/imm32
<span id="L2965" class="LineNr">2965 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L2966" class="LineNr">2966 </span>    e8/call  <a href='../058stream-equal.subx.html#L565'>check-next-stream-line-equal</a>/disp32
<span id="L2967" class="LineNr">2967 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L2968" class="LineNr">2968 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L2969" class="LineNr">2969 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L2970" class="LineNr">2970 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L2971" class="LineNr">2971 </span>    5d/pop-to-ebp
<span id="L2972" class="LineNr">2972 </span>    c3/return
<span id="L2973" class="LineNr">2973 </span>
<span id="L2974" class="LineNr">2974 </span><span class="subxTest">test-emit-segments-code-label-absolute</span>:
<span id="L2975" class="LineNr">2975 </span>    <span class="subxComment"># labels can also convert to absolute addresses</span>
<span id="L2976" class="LineNr">2976 </span>    <span class="subxComment">#</span>
<span id="L2977" class="LineNr">2977 </span>    <span class="subxComment"># input:</span>
<span id="L2978" class="LineNr">2978 </span>    <span class="subxComment">#   in:</span>
<span id="L2979" class="LineNr">2979 </span>    <span class="subxComment">#     == code 0x1000</span>
<span id="L2980" class="LineNr">2980 </span>    <span class="subxComment">#     ab cd</span>
<span id="L2981" class="LineNr">2981 </span>    <span class="subxComment">#     l1:</span>
<span id="L2982" class="LineNr">2982 </span>    <span class="subxComment">#       ef gh</span>
<span id="L2983" class="LineNr">2983 </span>    <span class="subxComment">#       ij l1/imm32</span>
<span id="L2984" class="LineNr">2984 </span>    <span class="subxComment">#   segments:</span>
<span id="L2985" class="LineNr">2985 </span>    <span class="subxComment">#     - 'code': {0x1054, 0, 9}</span>
<span id="L2986" class="LineNr">2986 </span>    <span class="subxComment">#   labels:</span>
<span id="L2987" class="LineNr">2987 </span>    <span class="subxComment">#     - 'l1': {'code', 2, 0x1056}</span>
<span id="L2988" class="LineNr">2988 </span>    <span class="subxComment">#</span>
<span id="L2989" class="LineNr">2989 </span>    <span class="subxComment"># output:</span>
<span id="L2990" class="LineNr">2990 </span>    <span class="subxComment">#   ab cd</span>
<span id="L2991" class="LineNr">2991 </span>    <span class="subxComment">#   ef gh</span>
<span id="L2992" class="LineNr">2992 </span>    <span class="subxComment">#   ij 56 10 00 00</span>
<span id="L2993" class="LineNr">2993 </span>    <span class="subxComment">#</span>
<span id="L2994" class="LineNr">2994 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L2995" class="LineNr">2995 </span>    55/push-ebp
<span id="L2996" class="LineNr">2996 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L2997" class="LineNr">2997 </span>    <span class="subxComment"># setup</span>
<span id="L2998" class="LineNr">2998 </span>    <span class="subxS1Comment"># . clear-stream(_test-input-stream)</span>
<span id="L2999" class="LineNr">2999 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3000" class="LineNr">3000 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L3001" class="LineNr">3001 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3002" class="LineNr">3002 </span>    e8/call  <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L3003" class="LineNr">3003 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3004" class="LineNr">3004 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L3005" class="LineNr">3005 </span>    <span class="subxS1Comment"># . clear-stream(_test-output-stream)</span>
<span id="L3006" class="LineNr">3006 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3007" class="LineNr">3007 </span>    68/push  <a href='../064write-byte.subx.html#L286'>_test-output-stream</a>/imm32
<span id="L3008" class="LineNr">3008 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3009" class="LineNr">3009 </span>    e8/call  <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L3010" class="LineNr">3010 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3011" class="LineNr">3011 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L3012" class="LineNr">3012 </span>    <span class="subxS1Comment"># . clear-stream($_test-output-buffered-file-&gt;buffer)</span>
<span id="L3013" class="LineNr">3013 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3014" class="LineNr">3014 </span>    68/push  $_test-output-buffered-file-&gt;buffer/imm32
<span id="L3015" class="LineNr">3015 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3016" class="LineNr">3016 </span>    e8/call  <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L3017" class="LineNr">3017 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3018" class="LineNr">3018 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L3019" class="LineNr">3019 </span>    <span class="subxS1Comment"># . var segments/ecx : (stream byte 10*16)</span>
<span id="L3020" class="LineNr">3020 </span>    81          5/subop/subtract    3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xa0/imm32        <span class="subxComment"># subtract from esp</span>
<span id="L3021" class="LineNr">3021 </span>    68/push  0xa0/imm32/length
<span id="L3022" class="LineNr">3022 </span>    68/push  0/imm32/read
<span id="L3023" class="LineNr">3023 </span>    68/push  0/imm32/write
<span id="L3024" class="LineNr">3024 </span>    89/copy                         3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ecx</span>
<span id="L3025" class="LineNr">3025 </span>    <span class="subxS1Comment"># . var labels/edx : (stream byte 512*16)</span>
<span id="L3026" class="LineNr">3026 </span>    81          5/subop/subtract    3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x2000/imm32      <span class="subxComment"># subtract from esp</span>
<span id="L3027" class="LineNr">3027 </span>    68/push  0x2000/imm32/length
<span id="L3028" class="LineNr">3028 </span>    68/push  0/imm32/read
<span id="L3029" class="LineNr">3029 </span>    68/push  0/imm32/write
<span id="L3030" class="LineNr">3030 </span>    89/copy                         3/mod/direct    2/rm32/edx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to edx</span>
<span id="L3031" class="LineNr">3031 </span>    <span class="subxComment"># initialize input</span>
<span id="L3032" class="LineNr">3032 </span>    <span class="subxS1Comment"># . write(_test-input-stream, &quot;== code 0x1000\n&quot;)</span>
<span id="L3033" class="LineNr">3033 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3034" class="LineNr">3034 </span>    68/push  <span class="Constant">&quot;== code 0x1000\n&quot;</span>/imm32
<span id="L3035" class="LineNr">3035 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L3036" class="LineNr">3036 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3037" class="LineNr">3037 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L3038" class="LineNr">3038 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3039" class="LineNr">3039 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L3040" class="LineNr">3040 </span>    <span class="subxS1Comment"># . write(_test-input-stream, &quot;ab cd\n&quot;)</span>
<span id="L3041" class="LineNr">3041 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3042" class="LineNr">3042 </span>    68/push  <span class="Constant">&quot;ab cd\n&quot;</span>/imm32
<span id="L3043" class="LineNr">3043 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L3044" class="LineNr">3044 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3045" class="LineNr">3045 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L3046" class="LineNr">3046 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3047" class="LineNr">3047 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L3048" class="LineNr">3048 </span>    <span class="subxS1Comment"># . write(_test-input-stream, &quot;l1:\n&quot;)</span>
<span id="L3049" class="LineNr">3049 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3050" class="LineNr">3050 </span>    68/push  <span class="Constant">&quot;l1:\n&quot;</span>/imm32
<span id="L3051" class="LineNr">3051 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L3052" class="LineNr">3052 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3053" class="LineNr">3053 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L3054" class="LineNr">3054 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3055" class="LineNr">3055 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L3056" class="LineNr">3056 </span>    <span class="subxS1Comment"># . write(_test-input-stream, &quot;  ef gh\n&quot;)</span>
<span id="L3057" class="LineNr">3057 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3058" class="LineNr">3058 </span>    68/push  <span class="Constant">&quot;  ef gh\n&quot;</span>/imm32
<span id="L3059" class="LineNr">3059 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L3060" class="LineNr">3060 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3061" class="LineNr">3061 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L3062" class="LineNr">3062 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3063" class="LineNr">3063 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L3064" class="LineNr">3064 </span>    <span class="subxS1Comment"># . write(_test-input-stream, &quot;  ij l1/imm32\n&quot;)</span>
<span id="L3065" class="LineNr">3065 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3066" class="LineNr">3066 </span>    68/push  <span class="Constant">&quot;  ij l1/imm32\n&quot;</span>/imm32
<span id="L3067" class="LineNr">3067 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L3068" class="LineNr">3068 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3069" class="LineNr">3069 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L3070" class="LineNr">3070 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3071" class="LineNr">3071 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L3072" class="LineNr">3072 </span>    <span class="subxS1Comment"># . stream-add4(segments, &quot;code&quot;, 0x1054, 0, 9)</span>
<span id="L3073" class="LineNr">3073 </span>    68/push  9/imm32/segment-size
<span id="L3074" class="LineNr">3074 </span>    68/push  0/imm32/file-offset
<span id="L3075" class="LineNr">3075 </span>    68/push  0x1054/imm32/start-address
<span id="L3076" class="LineNr">3076 </span>    68/push  <span class="Constant">&quot;code&quot;</span>/imm32/segment-name
<span id="L3077" class="LineNr">3077 </span>    51/push-ecx
<span id="L3078" class="LineNr">3078 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3079" class="LineNr">3079 </span>    e8/call  <a href='survey.subx.html#L3471'>stream-add4</a>/disp32
<span id="L3080" class="LineNr">3080 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3081" class="LineNr">3081 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x14/imm32        <span class="subxComment"># add to esp</span>
<span id="L3082" class="LineNr">3082 </span>    <span class="subxS1Comment"># . stream-add4(labels, &quot;l1&quot;, &quot;code&quot;, 2, 0x1056)</span>
<span id="L3083" class="LineNr">3083 </span>    68/push  0x1056/imm32/label-address
<span id="L3084" class="LineNr">3084 </span>    68/push  2/imm32/segment-offset
<span id="L3085" class="LineNr">3085 </span>    68/push  <span class="Constant">&quot;code&quot;</span>/imm32/segment-name
<span id="L3086" class="LineNr">3086 </span>    68/push  <span class="Constant">&quot;l1&quot;</span>/imm32/label-name
<span id="L3087" class="LineNr">3087 </span>    52/push-edx
<span id="L3088" class="LineNr">3088 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3089" class="LineNr">3089 </span>    e8/call  <a href='survey.subx.html#L3471'>stream-add4</a>/disp32
<span id="L3090" class="LineNr">3090 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3091" class="LineNr">3091 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x14/imm32        <span class="subxComment"># add to esp</span>
<span id="L3092" class="LineNr">3092 </span>    <span class="subxComment"># component under test</span>
<span id="L3093" class="LineNr">3093 </span>    <span class="subxS1Comment"># . emit-segments(_test-input-stream, _test-output-buffered-file, segments, labels)</span>
<span id="L3094" class="LineNr">3094 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3095" class="LineNr">3095 </span>    52/push-edx
<span id="L3096" class="LineNr">3096 </span>    51/push-ecx
<span id="L3097" class="LineNr">3097 </span>    68/push  <a href='../064write-byte.subx.html#L328'>_test-output-buffered-file</a>/imm32
<span id="L3098" class="LineNr">3098 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L3099" class="LineNr">3099 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3100" class="LineNr">3100 </span>    e8/call  <a href='survey.subx.html#L1925'>emit-segments</a>/disp32
<span id="L3101" class="LineNr">3101 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3102" class="LineNr">3102 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x10/imm32        <span class="subxComment"># add to esp</span>
<span id="L3103" class="LineNr">3103 </span>    <span class="subxComment"># checks</span>
<span id="L3104" class="LineNr">3104 </span>    <span class="subxS1Comment"># . flush(_test-output-buffered-file)</span>
<span id="L3105" class="LineNr">3105 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3106" class="LineNr">3106 </span>    68/push  <a href='../064write-byte.subx.html#L328'>_test-output-buffered-file</a>/imm32
<span id="L3107" class="LineNr">3107 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3108" class="LineNr">3108 </span>    e8/call  <a href='../064write-byte.subx.html#L81'>flush</a>/disp32
<span id="L3109" class="LineNr">3109 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3110" class="LineNr">3110 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L3111" class="Folded">3111 </span><span class="Folded">+-- 33 lines: #?     # dump output ---------------------------------------------------------------------------------------------------------------------------</span>
<span id="L3144" class="LineNr">3144 </span>    <span class="subxS1Comment"># . check-next-stream-line-equal(_test-output-stream, &quot;ab cd &quot;, msg)</span>
<span id="L3145" class="LineNr">3145 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3146" class="LineNr">3146 </span>    68/push  <span class="Constant">&quot;F - <a href='survey.subx.html#L2974'>test-emit-segments-code-label-absolute</a>/0&quot;</span>/imm32
<span id="L3147" class="LineNr">3147 </span>    68/push  <span class="Constant">&quot;ab cd &quot;</span>/imm32
<span id="L3148" class="LineNr">3148 </span>    68/push  <a href='../064write-byte.subx.html#L286'>_test-output-stream</a>/imm32
<span id="L3149" class="LineNr">3149 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3150" class="LineNr">3150 </span>    e8/call  <a href='../058stream-equal.subx.html#L565'>check-next-stream-line-equal</a>/disp32
<span id="L3151" class="LineNr">3151 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3152" class="LineNr">3152 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L3153" class="LineNr">3153 </span>    <span class="subxS1Comment"># . check-next-stream-line-equal(_test-output-stream, &quot;ef gh &quot;, msg)</span>
<span id="L3154" class="LineNr">3154 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3155" class="LineNr">3155 </span>    68/push  <span class="Constant">&quot;F - <a href='survey.subx.html#L2974'>test-emit-segments-code-label-absolute</a>/1&quot;</span>/imm32
<span id="L3156" class="LineNr">3156 </span>    68/push  <span class="Constant">&quot;ef gh &quot;</span>/imm32
<span id="L3157" class="LineNr">3157 </span>    68/push  <a href='../064write-byte.subx.html#L286'>_test-output-stream</a>/imm32
<span id="L3158" class="LineNr">3158 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3159" class="LineNr">3159 </span>    e8/call  <a href='../058stream-equal.subx.html#L565'>check-next-stream-line-equal</a>/disp32
<span id="L3160" class="LineNr">3160 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3161" class="LineNr">3161 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L3162" class="LineNr">3162 </span>    <span class="subxS1Comment"># . check-next-stream-line-equal(_test-output-stream, &quot;ij f9 ff ff ff &quot;, msg)</span>
<span id="L3163" class="LineNr">3163 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3164" class="LineNr">3164 </span>    68/push  <span class="Constant">&quot;F - <a href='survey.subx.html#L2974'>test-emit-segments-code-label-absolute</a>/2&quot;</span>/imm32
<span id="L3165" class="LineNr">3165 </span>    68/push  <span class="Constant">&quot;ij 56 10 00 00 &quot;</span>/imm32
<span id="L3166" class="LineNr">3166 </span>    68/push  <a href='../064write-byte.subx.html#L286'>_test-output-stream</a>/imm32
<span id="L3167" class="LineNr">3167 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3168" class="LineNr">3168 </span>    e8/call  <a href='../058stream-equal.subx.html#L565'>check-next-stream-line-equal</a>/disp32
<span id="L3169" class="LineNr">3169 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3170" class="LineNr">3170 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L3171" class="LineNr">3171 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L3172" class="LineNr">3172 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L3173" class="LineNr">3173 </span>    5d/pop-to-ebp
<span id="L3174" class="LineNr">3174 </span>    c3/return
<span id="L3175" class="LineNr">3175 </span>
<span id="L3176" class="LineNr">3176 </span><span class="subxFunction">emit-headers</span>:  <span class="subxComment"># out : (addr buffered-file), segments : (addr stream {string, segment-info}), labels : (addr stream {string, label-info})</span>
<span id="L3177" class="LineNr">3177 </span>    <span class="subxComment"># pseudocode:</span>
<span id="L3178" class="LineNr">3178 </span>    <span class="subxComment">#   emit-elf-header(out, segments, labels)</span>
<span id="L3179" class="LineNr">3179 </span>    <span class="subxComment">#   curr-segment = segments-&gt;data</span>
<span id="L3180" class="LineNr">3180 </span>    <span class="subxComment">#   max = &amp;segments-&gt;data[segments-&gt;write]</span>
<span id="L3181" class="LineNr">3181 </span>    <span class="subxComment">#   while true</span>
<span id="L3182" class="LineNr">3182 </span>    <span class="subxComment">#     if (curr-segment &gt;= max) break</span>
<span id="L3183" class="LineNr">3183 </span>    <span class="subxComment">#     emit-elf-program-header-entry(out, curr-segment)</span>
<span id="L3184" class="LineNr">3184 </span>    <span class="subxComment">#     curr-segment += 16                        # size of a row</span>
<span id="L3185" class="LineNr">3185 </span>    <span class="subxComment">#</span>
<span id="L3186" class="LineNr">3186 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L3187" class="LineNr">3187 </span>    55/push-ebp
<span id="L3188" class="LineNr">3188 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L3189" class="LineNr">3189 </span>    <span class="subxS1Comment"># . save registers</span>
<span id="L3190" class="LineNr">3190 </span>    50/push-eax
<span id="L3191" class="LineNr">3191 </span>    51/push-ecx
<span id="L3192" class="Folded">3192 </span><span class="Folded">+--  9 lines: #?     # write(2/stderr, &quot;emit-elf-header\n&quot;) --------------------------------------------------------------------------------------------------</span>
<span id="L3201" class="LineNr">3201 </span>    <span class="subxComment"># emit-elf-header(out, segments, labels)</span>
<span id="L3202" class="LineNr">3202 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3203" class="LineNr">3203 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0x10/disp8     <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+16)</span>
<span id="L3204" class="LineNr">3204 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+12)</span>
<span id="L3205" class="LineNr">3205 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+8)</span>
<span id="L3206" class="LineNr">3206 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3207" class="LineNr">3207 </span>    e8/call  <a href='survey.subx.html#L3314'>emit-elf-header</a>/disp32
<span id="L3208" class="LineNr">3208 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3209" class="LineNr">3209 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L3210" class="LineNr">3210 </span>    <span class="subxComment"># eax = segments</span>
<span id="L3211" class="LineNr">3211 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+12) to eax</span>
<span id="L3212" class="LineNr">3212 </span>    <span class="subxComment"># ecx = segments-&gt;write</span>
<span id="L3213" class="LineNr">3213 </span>    8b/copy                         0/mod/indirect  0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *eax to ecx</span>
<span id="L3214" class="LineNr">3214 </span>    <span class="subxComment"># curr-segment/eax = segments-&gt;data</span>
<span id="L3215" class="LineNr">3215 </span>    8d/copy-address                 1/mod/*+disp8   0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy eax+12 to eax</span>
<span id="L3216" class="LineNr">3216 </span>    <span class="subxComment"># max/ecx = &amp;segments-&gt;data[segments-&gt;write]</span>
<span id="L3217" class="LineNr">3217 </span>    01/add                          3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># add eax to ecx</span>
<span id="L3218" class="LineNr">3218 </span><span class="Constant">$emit-headers:loop</span>:
<span id="L3219" class="LineNr">3219 </span>    <span class="subxComment"># if (curr-segment &gt;= max) break</span>
<span id="L3220" class="LineNr">3220 </span>    39/compare                      3/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># compare eax with ecx</span>
<span id="L3221" class="LineNr">3221 </span>    0f 83/jump-if-addr&gt;=  $emit-headers:end/disp32
<span id="L3222" class="Folded">3222 </span><span class="Folded">+-- 63 lines: #?     # dump curr-segment-&gt;name ---------------------------------------------------------------------------------------------------------------</span>
<span id="L3285" class="Folded">3285 </span><span class="Folded">+--  9 lines: #?     # write(2/stderr, &quot;emit-segment-header\n&quot;) ----------------------------------------------------------------------------------------------</span>
<span id="L3294" class="LineNr">3294 </span>    <span class="subxComment"># emit-elf-program-header-entry(out, curr-segment)</span>
<span id="L3295" class="LineNr">3295 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3296" class="LineNr">3296 </span>    50/push-eax
<span id="L3297" class="LineNr">3297 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+8)</span>
<span id="L3298" class="LineNr">3298 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3299" class="LineNr">3299 </span>    e8/call  <a href='survey.subx.html#L3382'>emit-elf-program-header-entry</a>/disp32
<span id="L3300" class="LineNr">3300 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3301" class="LineNr">3301 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L3302" class="LineNr">3302 </span>    <span class="subxComment"># curr-segment += 16                        # size of a row</span>
<span id="L3303" class="LineNr">3303 </span>    81          0/subop/add         3/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x10/imm32        <span class="subxComment"># add to eax</span>
<span id="L3304" class="LineNr">3304 </span>    e9/jump  $emit-headers:<span class="Constant">loop</span>/disp32
<span id="L3305" class="LineNr">3305 </span><span class="Constant">$emit-headers:end</span>:
<span id="L3306" class="LineNr">3306 </span>    <span class="subxS1Comment"># . restore registers</span>
<span id="L3307" class="LineNr">3307 </span>    59/pop-to-ecx
<span id="L3308" class="LineNr">3308 </span>    58/pop-to-eax
<span id="L3309" class="LineNr">3309 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L3310" class="LineNr">3310 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L3311" class="LineNr">3311 </span>    5d/pop-to-ebp
<span id="L3312" class="LineNr">3312 </span>    c3/return
<span id="L3313" class="LineNr">3313 </span>
<span id="L3314" class="LineNr">3314 </span><span class="subxFunction">emit-elf-header</span>:  <span class="subxComment"># out : (addr buffered-file), segments : (addr stream {string, segment-info}), labels : (addr stream {string, label-info})</span>
<span id="L3315" class="LineNr">3315 </span>    <span class="subxComment"># pseudocode</span>
<span id="L3316" class="LineNr">3316 </span>    <span class="subxComment">#   *$Elf_e_entry = get(labels, &quot;Entry&quot;)-&gt;address</span>
<span id="L3317" class="LineNr">3317 </span>    <span class="subxComment">#   *$Elf_e_phnum = segments-&gt;write / 16         # size of a row</span>
<span id="L3318" class="LineNr">3318 </span>    <span class="subxComment">#   emit-hex-array(out, Elf_header)</span>
<span id="L3319" class="LineNr">3319 </span>    <span class="subxComment">#   write-buffered(out, &quot;\n&quot;)</span>
<span id="L3320" class="LineNr">3320 </span>    <span class="subxComment">#</span>
<span id="L3321" class="LineNr">3321 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L3322" class="LineNr">3322 </span>    55/push-ebp
<span id="L3323" class="LineNr">3323 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L3324" class="LineNr">3324 </span>    <span class="subxS1Comment"># . save registers</span>
<span id="L3325" class="LineNr">3325 </span>    50/push-eax
<span id="L3326" class="LineNr">3326 </span>    51/push-ecx
<span id="L3327" class="LineNr">3327 </span>    52/push-edx  <span class="subxComment"># just because we need to call idiv</span>
<span id="L3328" class="LineNr">3328 </span>    <span class="subxComment"># *$Elf_e_entry = get(labels, &quot;Entry&quot;)-&gt;address</span>
<span id="L3329" class="LineNr">3329 </span>    <span class="subxS1Comment"># . eax = labels</span>
<span id="L3330" class="LineNr">3330 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   0x10/disp8     <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+16) to eax</span>
<span id="L3331" class="LineNr">3331 </span>    <span class="subxS1Comment"># . label-info/eax = get(labels, &quot;Entry&quot;, row-size=16, &quot;label table&quot;)</span>
<span id="L3332" class="LineNr">3332 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3333" class="LineNr">3333 </span>    68/push  <span class="Constant">&quot;label table&quot;</span>/imm32
<span id="L3334" class="LineNr">3334 </span>    68/push  0x10/imm32/row-size
<span id="L3335" class="LineNr">3335 </span>    68/push  <span class="Constant">&quot;Entry&quot;</span>/imm32
<span id="L3336" class="LineNr">3336 </span>    50/push-eax
<span id="L3337" class="LineNr">3337 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3338" class="LineNr">3338 </span>    e8/call  <a href='../081table.subx.html#L27'>get</a>/disp32
<span id="L3339" class="LineNr">3339 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3340" class="LineNr">3340 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x10/imm32        <span class="subxComment"># add to esp</span>
<span id="L3341" class="LineNr">3341 </span>    <span class="subxS1Comment"># . eax = label-info-&gt;address</span>
<span id="L3342" class="LineNr">3342 </span>    8b/copy                         1/mod/*+disp8   0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(eax+8) to eax</span>
<span id="L3343" class="LineNr">3343 </span>    <span class="subxS1Comment"># . *$Elf_e_entry = eax</span>
<span id="L3344" class="LineNr">3344 </span>    89/copy                         0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   $<span class="SpecialChar">Elf_e_entry</span>/disp32               <span class="subxComment"># copy eax to *$Elf_e_entry</span>
<span id="L3345" class="LineNr">3345 </span>    <span class="subxComment"># *$Elf_e_phnum = segments-&gt;write / 0x10</span>
<span id="L3346" class="LineNr">3346 </span>    <span class="subxS1Comment"># . eax = segments</span>
<span id="L3347" class="LineNr">3347 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+12) to eax</span>
<span id="L3348" class="LineNr">3348 </span>    <span class="subxS1Comment"># . len/eax = segments-&gt;write</span>
<span id="L3349" class="LineNr">3349 </span>    8b/copy                         0/mod/indirect  0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *eax to eax</span>
<span id="L3350" class="LineNr">3350 </span>    <span class="subxS1Comment"># . eax = len / 0x10  (destroying edx)</span>
<span id="L3351" class="LineNr">3351 </span>    b9/copy-to-ecx  0x10/imm32
<span id="L3352" class="LineNr">3352 </span>    31/xor                          3/mod/direct    2/rm32/edx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          2/r32/edx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># clear edx</span>
<span id="L3353" class="LineNr">3353 </span>    f7          7/subop/idiv        3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># divide edx:eax by ecx, storing quotient in eax and remainder in edx</span>
<span id="L3354" class="LineNr">3354 </span>    <span class="subxS1Comment"># . *$Elf_e_phnum = eax</span>
<span id="L3355" class="LineNr">3355 </span>    89/copy                         0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   $<span class="SpecialChar">Elf_e_phnum</span>/disp32               <span class="subxComment"># copy eax to *$Elf_e_phnum</span>
<span id="L3356" class="LineNr">3356 </span>    <span class="subxComment"># emit-hex-array(out, Elf_header)</span>
<span id="L3357" class="LineNr">3357 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3358" class="LineNr">3358 </span>    68/push  <span class="SpecialChar"><a href='survey.subx.html#L4672'>Elf_header</a></span>/imm32
<span id="L3359" class="LineNr">3359 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+8)</span>
<span id="L3360" class="LineNr">3360 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3361" class="LineNr">3361 </span>    e8/call  <a href='../084emit-hex-array.subx.html#L7'>emit-hex-array</a>/disp32
<span id="L3362" class="LineNr">3362 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3363" class="LineNr">3363 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L3364" class="LineNr">3364 </span>    <span class="subxComment"># write-buffered(out, &quot;\n&quot;)</span>
<span id="L3365" class="LineNr">3365 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3366" class="LineNr">3366 </span>    68/push  <span class="SpecialChar"><a href='../051test.subx.html#L83'>Newline</a></span>/imm32
<span id="L3367" class="LineNr">3367 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+8)</span>
<span id="L3368" class="LineNr">3368 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3369" class="LineNr">3369 </span>    e8/call  <a href='../065write-buffered.subx.html#L8'>write-buffered</a>/disp32
<span id="L3370" class="LineNr">3370 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3371" class="LineNr">3371 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L3372" class="LineNr">3372 </span><span class="Constant">$emit-elf-header:end</span>:
<span id="L3373" class="LineNr">3373 </span>    <span class="subxS1Comment"># . restore registers</span>
<span id="L3374" class="LineNr">3374 </span>    5a/pop-to-edx
<span id="L3375" class="LineNr">3375 </span>    59/pop-to-ecx
<span id="L3376" class="LineNr">3376 </span>    58/pop-to-eax
<span id="L3377" class="LineNr">3377 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L3378" class="LineNr">3378 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L3379" class="LineNr">3379 </span>    5d/pop-to-ebp
<span id="L3380" class="LineNr">3380 </span>    c3/return
<span id="L3381" class="LineNr">3381 </span>
<span id="L3382" class="LineNr">3382 </span><span class="subxFunction">emit-elf-program-header-entry</span>:  <span class="subxComment"># out : (addr buffered-file), curr-segment : (addr {string, segment-info})</span>
<span id="L3383" class="LineNr">3383 </span>    <span class="subxComment"># pseudocode:</span>
<span id="L3384" class="LineNr">3384 </span>    <span class="subxComment">#   *$Elf_p_offset = curr-segment-&gt;file-offset</span>
<span id="L3385" class="LineNr">3385 </span>    <span class="subxComment">#   *$Elf_p_vaddr = curr-segment-&gt;address</span>
<span id="L3386" class="LineNr">3386 </span>    <span class="subxComment">#   *$Elf_p_paddr = curr-segment-&gt;address</span>
<span id="L3387" class="LineNr">3387 </span>    <span class="subxComment">#   *$Elf_p_filesz = curr-segment-&gt;size</span>
<span id="L3388" class="LineNr">3388 </span>    <span class="subxComment">#   *$Elf_p_memsz = curr-segment-&gt;size</span>
<span id="L3389" class="LineNr">3389 </span>    <span class="subxComment">#   if curr-segment-&gt;name == &quot;code&quot;</span>
<span id="L3390" class="LineNr">3390 </span>    <span class="subxComment">#     *$Elf_p_flags = 5  # r-x</span>
<span id="L3391" class="LineNr">3391 </span>    <span class="subxComment">#   else</span>
<span id="L3392" class="LineNr">3392 </span>    <span class="subxComment">#     *$Elf_p_flags = 6  # rw-</span>
<span id="L3393" class="LineNr">3393 </span>    <span class="subxComment">#   emit-hex-array(out, Elf_program_header_entry)</span>
<span id="L3394" class="LineNr">3394 </span>    <span class="subxComment">#   write-buffered(out, &quot;\n&quot;)</span>
<span id="L3395" class="LineNr">3395 </span>    <span class="subxComment">#</span>
<span id="L3396" class="LineNr">3396 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L3397" class="LineNr">3397 </span>    55/push-ebp
<span id="L3398" class="LineNr">3398 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L3399" class="LineNr">3399 </span>    <span class="subxS1Comment"># . save registers</span>
<span id="L3400" class="LineNr">3400 </span>    50/push-eax
<span id="L3401" class="LineNr">3401 </span>    56/push-esi
<span id="L3402" class="LineNr">3402 </span>    <span class="subxComment"># esi = curr-segment</span>
<span id="L3403" class="LineNr">3403 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          6/r32/esi   0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+12) to esi</span>
<span id="L3404" class="LineNr">3404 </span>    <span class="subxComment"># *$Elf_p_offset = curr-segment-&gt;file-offset</span>
<span id="L3405" class="LineNr">3405 </span>    <span class="subxS1Comment"># . eax = curr-segment-&gt;file-offset</span>
<span id="L3406" class="LineNr">3406 </span>    8b/copy                         1/mod/*+disp8   6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(esi+8) to eax</span>
<span id="L3407" class="LineNr">3407 </span>    <span class="subxS1Comment"># . *$Elf_p_offset = eax</span>
<span id="L3408" class="LineNr">3408 </span>    89/copy                         0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   $<span class="SpecialChar">Elf_p_offset</span>/disp32              <span class="subxComment"># copy eax to *$Elf_p_offset</span>
<span id="L3409" class="LineNr">3409 </span>    <span class="subxComment"># *$Elf_p_vaddr = curr-segment-&gt;address</span>
<span id="L3410" class="LineNr">3410 </span>    <span class="subxS1Comment"># . eax = curr-segment-&gt;address</span>
<span id="L3411" class="LineNr">3411 </span>    8b/copy                         1/mod/*+disp8   6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(esi+4) to eax</span>
<span id="L3412" class="LineNr">3412 </span>    <span class="subxS1Comment"># . *$Elf_p_vaddr = eax</span>
<span id="L3413" class="LineNr">3413 </span>    89/copy                         0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   $<span class="SpecialChar">Elf_p_vaddr</span>/disp32               <span class="subxComment"># copy eax to *$Elf_p_vaddr</span>
<span id="L3414" class="LineNr">3414 </span>    <span class="subxComment"># *$Elf_p_paddr = curr-segment-&gt;address</span>
<span id="L3415" class="LineNr">3415 </span>    89/copy                         0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   $<span class="SpecialChar">Elf_p_paddr</span>/disp32               <span class="subxComment"># copy eax to *$Elf_p_paddr</span>
<span id="L3416" class="LineNr">3416 </span>    <span class="subxComment"># *$Elf_p_filesz = curr-segment-&gt;size</span>
<span id="L3417" class="LineNr">3417 </span>    <span class="subxS1Comment"># . eax = curr-segment-&gt;size</span>
<span id="L3418" class="LineNr">3418 </span>    8b/copy                         1/mod/*+disp8   6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy *(esi+12) to eax</span>
<span id="L3419" class="LineNr">3419 </span>    <span class="subxS1Comment"># . *$Elf_p_filesz = eax</span>
<span id="L3420" class="LineNr">3420 </span>    89/copy                         0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   $<span class="SpecialChar">Elf_p_filesz</span>/disp32              <span class="subxComment"># copy eax to *$Elf_p_filesz</span>
<span id="L3421" class="LineNr">3421 </span>    <span class="subxComment"># *$Elf_p_memsz = curr-segment-&gt;size</span>
<span id="L3422" class="LineNr">3422 </span>    89/copy                         0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   $<span class="SpecialChar">Elf_p_memsz</span>/disp32               <span class="subxComment"># copy eax to *$Elf_p_memsz</span>
<span id="L3423" class="LineNr">3423 </span>    <span class="subxComment"># if (!string-equal?(curr-segment-&gt;name, &quot;code&quot;) goto next check</span>
<span id="L3424" class="LineNr">3424 </span>    <span class="subxS1Comment"># . eax = curr-segment-&gt;name</span>
<span id="L3425" class="LineNr">3425 </span>    8b/copy                         0/mod/indirect  6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *esi to eax</span>
<span id="L3426" class="LineNr">3426 </span>    <span class="subxS1Comment"># . eax = string-equal?(curr-segment-&gt;name, &quot;code&quot;)</span>
<span id="L3427" class="LineNr">3427 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3428" class="LineNr">3428 </span>    68/push  <span class="Constant">&quot;code&quot;</span>/imm32
<span id="L3429" class="LineNr">3429 </span>    50/push-eax
<span id="L3430" class="LineNr">3430 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3431" class="LineNr">3431 </span>    e8/call  <a href='../054string-equal.subx.html#L16'>string-equal?</a>/disp32
<span id="L3432" class="LineNr">3432 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3433" class="LineNr">3433 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L3434" class="LineNr">3434 </span>    <span class="subxS1Comment"># . if (eax == false) goto next check</span>
<span id="L3435" class="LineNr">3435 </span>    3d/compare-eax-and  0/imm32/false
<span id="L3436" class="LineNr">3436 </span>    74/jump-if-=  $emit-elf-program-header-entry:data/disp8
<span id="L3437" class="LineNr">3437 </span>    <span class="subxComment"># *$Elf_p_flags = r-x</span>
<span id="L3438" class="LineNr">3438 </span>    c7          0/subop/copy        0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          $<span class="SpecialChar">Elf_p_flags</span>/disp32  5/imm32      <span class="subxComment"># copy to *$Elf_p_flags</span>
<span id="L3439" class="LineNr">3439 </span>    eb/jump  $emit-elf-program-header-entry:really-emit/disp8
<span id="L3440" class="LineNr">3440 </span><span class="Constant">$emit-elf-program-header-entry:data</span>:
<span id="L3441" class="LineNr">3441 </span>    <span class="subxComment"># otherwise *$Elf_p_flags = rw-</span>
<span id="L3442" class="LineNr">3442 </span>    c7          0/subop/copy        0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          $<span class="SpecialChar">Elf_p_flags</span>/disp32  6/imm32      <span class="subxComment"># copy to *$Elf_p_flags</span>
<span id="L3443" class="LineNr">3443 </span><span class="Constant">$emit-elf-program-header-entry:really-emit</span>:
<span id="L3444" class="LineNr">3444 </span>    <span class="subxComment"># emit-hex-array(out, Elf_program_header_entry)</span>
<span id="L3445" class="LineNr">3445 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3446" class="LineNr">3446 </span>    68/push  <span class="SpecialChar"><a href='survey.subx.html#L4710'>Elf_program_header_entry</a></span>/imm32
<span id="L3447" class="LineNr">3447 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+8)</span>
<span id="L3448" class="LineNr">3448 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3449" class="LineNr">3449 </span>    e8/call  <a href='../084emit-hex-array.subx.html#L7'>emit-hex-array</a>/disp32
<span id="L3450" class="LineNr">3450 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3451" class="LineNr">3451 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L3452" class="LineNr">3452 </span>    <span class="subxComment"># write-buffered(out, &quot;\n&quot;)</span>
<span id="L3453" class="LineNr">3453 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3454" class="LineNr">3454 </span>    68/push  <span class="SpecialChar"><a href='../051test.subx.html#L83'>Newline</a></span>/imm32
<span id="L3455" class="LineNr">3455 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+8)</span>
<span id="L3456" class="LineNr">3456 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3457" class="LineNr">3457 </span>    e8/call  <a href='../065write-buffered.subx.html#L8'>write-buffered</a>/disp32
<span id="L3458" class="LineNr">3458 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3459" class="LineNr">3459 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L3460" class="LineNr">3460 </span><span class="Constant">$emit-elf-program-header-entry:end</span>:
<span id="L3461" class="LineNr">3461 </span>    <span class="subxS1Comment"># . restore registers</span>
<span id="L3462" class="LineNr">3462 </span>    5e/pop-to-esi
<span id="L3463" class="LineNr">3463 </span>    58/pop-to-eax
<span id="L3464" class="LineNr">3464 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L3465" class="LineNr">3465 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L3466" class="LineNr">3466 </span>    5d/pop-to-ebp
<span id="L3467" class="LineNr">3467 </span>    c3/return
<span id="L3468" class="LineNr">3468 </span>
<span id="L3469" class="LineNr">3469 </span><span class="subxH1Comment"># - some helpers for tests</span>
<span id="L3470" class="LineNr">3470 </span>
<span id="L3471" class="LineNr">3471 </span><span class="subxFunction">stream-add4</span>:  <span class="subxComment"># in : (addr stream byte), key : addr, val1 : addr, val2 : addr, val3 : addr</span>
<span id="L3472" class="LineNr">3472 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L3473" class="LineNr">3473 </span>    55/push-ebp
<span id="L3474" class="LineNr">3474 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L3475" class="LineNr">3475 </span>    <span class="subxS1Comment"># . save registers</span>
<span id="L3476" class="LineNr">3476 </span>    50/push-eax
<span id="L3477" class="LineNr">3477 </span>    51/push-ecx
<span id="L3478" class="LineNr">3478 </span>    52/push-edx
<span id="L3479" class="LineNr">3479 </span>    56/push-esi
<span id="L3480" class="LineNr">3480 </span>    <span class="subxComment"># esi = in</span>
<span id="L3481" class="LineNr">3481 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          6/r32/esi   8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+8) to esi</span>
<span id="L3482" class="LineNr">3482 </span>    <span class="subxComment"># curr/eax = &amp;in-&gt;data[in-&gt;write]</span>
<span id="L3483" class="LineNr">3483 </span>    <span class="subxS1Comment"># . eax = in-&gt;write</span>
<span id="L3484" class="LineNr">3484 </span>    8b/copy                         0/mod/indirect  6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *esi to eax</span>
<span id="L3485" class="LineNr">3485 </span>    <span class="subxS1Comment"># . eax = esi+eax+12</span>
<span id="L3486" class="LineNr">3486 </span>    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    6/base/esi  0/index/eax  <span class="Normal"> . </span>          0/r32/eax   0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy esi+eax+12 to eax</span>
<span id="L3487" class="LineNr">3487 </span>    <span class="subxComment"># max/edx = &amp;in-&gt;data[in-&gt;length]</span>
<span id="L3488" class="LineNr">3488 </span>    <span class="subxS1Comment"># . edx = in-&gt;length</span>
<span id="L3489" class="LineNr">3489 </span>    8b/copy                         1/mod/*+disp8   6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          2/r32/edx   8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(esi+8) to edx</span>
<span id="L3490" class="LineNr">3490 </span>    <span class="subxS1Comment"># . edx = esi+edx+12</span>
<span id="L3491" class="LineNr">3491 </span>    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    6/base/esi  2/index/edx  <span class="Normal"> . </span>          2/r32/edx   0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy esi+edx+12 to edx</span>
<span id="L3492" class="LineNr">3492 </span>    <span class="subxComment"># if (curr &gt;= max) abort</span>
<span id="L3493" class="LineNr">3493 </span>    39/compare                      3/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          2/r32/edx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># compare eax with edx</span>
<span id="L3494" class="LineNr">3494 </span>    73/jump-if-addr&gt;=  $stream-add4:abort/disp8
<span id="L3495" class="LineNr">3495 </span>    <span class="subxComment"># *curr = key</span>
<span id="L3496" class="LineNr">3496 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>                        1/r32/ecx   0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+12) to ecx</span>
<span id="L3497" class="LineNr">3497 </span>    89/copy                         0/mod/indirect  0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ecx to *eax</span>
<span id="L3498" class="LineNr">3498 </span>    <span class="subxComment"># curr += 4</span>
<span id="L3499" class="LineNr">3499 </span>    05/add-to-eax  4/imm32
<span id="L3500" class="LineNr">3500 </span>    <span class="subxComment"># if (curr &gt;= max) abort</span>
<span id="L3501" class="LineNr">3501 </span>    39/compare                      3/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          2/r32/edx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># compare eax with edx</span>
<span id="L3502" class="LineNr">3502 </span>    73/jump-if-addr&gt;=  $stream-add4:abort/disp8
<span id="L3503" class="LineNr">3503 </span>    <span class="subxComment"># *curr = val1</span>
<span id="L3504" class="LineNr">3504 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>                        1/r32/ecx   0x10/disp8     <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+16) to ecx</span>
<span id="L3505" class="LineNr">3505 </span>    89/copy                         0/mod/indirect  0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ecx to *eax</span>
<span id="L3506" class="LineNr">3506 </span>    <span class="subxComment"># curr += 4</span>
<span id="L3507" class="LineNr">3507 </span>    05/add-to-eax  4/imm32
<span id="L3508" class="LineNr">3508 </span>    <span class="subxComment"># if (curr &gt;= max) abort</span>
<span id="L3509" class="LineNr">3509 </span>    39/compare                      3/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          2/r32/edx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># compare eax with edx</span>
<span id="L3510" class="LineNr">3510 </span>    73/jump-if-addr&gt;=  $stream-add4:abort/disp8
<span id="L3511" class="LineNr">3511 </span>    <span class="subxComment"># *curr = val2</span>
<span id="L3512" class="LineNr">3512 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>                        1/r32/ecx   0x14/disp8     <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+20) to ecx</span>
<span id="L3513" class="LineNr">3513 </span>    89/copy                         0/mod/indirect  0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ecx to *eax</span>
<span id="L3514" class="LineNr">3514 </span>    <span class="subxComment"># curr += 4</span>
<span id="L3515" class="LineNr">3515 </span>    05/add-to-eax  4/imm32
<span id="L3516" class="LineNr">3516 </span>    <span class="subxComment"># if (curr &gt;= max) abort</span>
<span id="L3517" class="LineNr">3517 </span>    39/compare                      3/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          2/r32/edx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># compare eax with edx</span>
<span id="L3518" class="LineNr">3518 </span>    73/jump-if-addr&gt;=  $stream-add4:abort/disp8
<span id="L3519" class="LineNr">3519 </span>    <span class="subxComment"># *curr = val3</span>
<span id="L3520" class="LineNr">3520 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>                        1/r32/ecx   0x18/disp8     <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+24) to ecx</span>
<span id="L3521" class="LineNr">3521 </span>    89/copy                         0/mod/indirect  0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ecx to *eax</span>
<span id="L3522" class="LineNr">3522 </span>    <span class="subxComment"># in-&gt;write += 16</span>
<span id="L3523" class="LineNr">3523 </span>    81          0/subop/add         0/mod/indirect  6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x10/imm32        <span class="subxComment"># add to *esi</span>
<span id="L3524" class="LineNr">3524 </span><span class="Constant">$stream-add4:end</span>:
<span id="L3525" class="LineNr">3525 </span>    <span class="subxS1Comment"># . restore registers</span>
<span id="L3526" class="LineNr">3526 </span>    5e/pop-to-esi
<span id="L3527" class="LineNr">3527 </span>    5a/pop-to-edx
<span id="L3528" class="LineNr">3528 </span>    59/pop-to-ecx
<span id="L3529" class="LineNr">3529 </span>    58/pop-to-eax
<span id="L3530" class="LineNr">3530 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L3531" class="LineNr">3531 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L3532" class="LineNr">3532 </span>    5d/pop-to-ebp
<span id="L3533" class="LineNr">3533 </span>    c3/return
<span id="L3534" class="LineNr">3534 </span>
<span id="L3535" class="LineNr">3535 </span><span class="Constant">$stream-add4:abort</span>:
<span id="L3536" class="LineNr">3536 </span>    <span class="subxS1Comment"># . _write(2/stderr, error)</span>
<span id="L3537" class="LineNr">3537 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3538" class="LineNr">3538 </span>    68/push  <span class="Constant">&quot;overflow in stream-add4\n&quot;</span>/imm32
<span id="L3539" class="LineNr">3539 </span>    68/push  2/imm32/stderr
<span id="L3540" class="LineNr">3540 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3541" class="LineNr">3541 </span>    e8/call  <a href='../050_write.subx.html#L14'>_write</a>/disp32
<span id="L3542" class="LineNr">3542 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3543" class="LineNr">3543 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L3544" class="LineNr">3544 </span>    <span class="subxS1Comment"># . syscall(exit, 1)</span>
<span id="L3545" class="LineNr">3545 </span>    bb/copy-to-ebx  1/imm32
<span id="L3546" class="LineNr">3546 </span>    b8/copy-to-eax  1/imm32/exit
<span id="L3547" class="LineNr">3547 </span>    cd/syscall  0x80/imm8
<span id="L3548" class="LineNr">3548 </span>    <span class="subxComment"># never gets here</span>
<span id="L3549" class="LineNr">3549 </span>
<span id="L3550" class="LineNr">3550 </span><span class="subxComment"># some variants of 'trace' that take multiple arguments in different combinations of types:</span>
<span id="L3551" class="LineNr">3551 </span><span class="subxComment">#   n: int</span>
<span id="L3552" class="LineNr">3552 </span><span class="subxComment">#   c: character [4-bytes, will eventually be UTF-8]</span>
<span id="L3553" class="LineNr">3553 </span><span class="subxComment">#   s: (addr string)</span>
<span id="L3554" class="LineNr">3554 </span><span class="subxComment">#   l: (addr slice)</span>
<span id="L3555" class="LineNr">3555 </span><span class="subxComment"># one gotcha: 's5' must not be empty</span>
<span id="L3556" class="LineNr">3556 </span>
<span id="L3557" class="LineNr">3557 </span><span class="subxFunction">trace-sssns</span>:  <span class="subxComment"># s1 : (addr string), s2 : (addr string), s3 : (addr string), n4 : int, s5 : (addr string)</span>
<span id="L3558" class="LineNr">3558 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L3559" class="LineNr">3559 </span>    55/push-ebp
<span id="L3560" class="LineNr">3560 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L3561" class="LineNr">3561 </span>    <span class="subxComment"># write(*Trace-stream, s1)</span>
<span id="L3562" class="LineNr">3562 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3563" class="LineNr">3563 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+8)</span>
<span id="L3564" class="LineNr">3564 </span>    ff          6/subop/push        0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          <span class="SpecialChar"><a href='../056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># push *Trace-stream</span>
<span id="L3565" class="LineNr">3565 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3566" class="LineNr">3566 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L3567" class="LineNr">3567 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3568" class="LineNr">3568 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L3569" class="LineNr">3569 </span>    <span class="subxComment"># write(*Trace-stream, s2)</span>
<span id="L3570" class="LineNr">3570 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3571" class="LineNr">3571 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+12)</span>
<span id="L3572" class="LineNr">3572 </span>    ff          6/subop/push        0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          <span class="SpecialChar"><a href='../056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># push *Trace-stream</span>
<span id="L3573" class="LineNr">3573 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3574" class="LineNr">3574 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L3575" class="LineNr">3575 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3576" class="LineNr">3576 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L3577" class="LineNr">3577 </span>    <span class="subxComment"># write(*Trace-stream, s3)</span>
<span id="L3578" class="LineNr">3578 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3579" class="LineNr">3579 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0x10/disp8     <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+16)</span>
<span id="L3580" class="LineNr">3580 </span>    ff          6/subop/push        0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          <span class="SpecialChar"><a href='../056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># push *Trace-stream</span>
<span id="L3581" class="LineNr">3581 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3582" class="LineNr">3582 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L3583" class="LineNr">3583 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3584" class="LineNr">3584 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L3585" class="LineNr">3585 </span>    <span class="subxComment"># print-int32(*Trace-stream, n4)</span>
<span id="L3586" class="LineNr">3586 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3587" class="LineNr">3587 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0x14/disp8     <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+20)</span>
<span id="L3588" class="LineNr">3588 </span>    ff          6/subop/push        0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          <span class="SpecialChar"><a href='../056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># push *Trace-stream</span>
<span id="L3589" class="LineNr">3589 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3590" class="LineNr">3590 </span>    e8/call  <a href='../066print-int.subx.html#L178'>print-int32</a>/disp32
<span id="L3591" class="LineNr">3591 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3592" class="LineNr">3592 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L3593" class="LineNr">3593 </span>    <span class="subxComment"># trace(s5)  # implicitly adds a newline and finalizes the trace line</span>
<span id="L3594" class="LineNr">3594 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3595" class="LineNr">3595 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0x18/disp8     <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+24)</span>
<span id="L3596" class="LineNr">3596 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3597" class="LineNr">3597 </span>    e8/call  <a href='../056trace.subx.html#L86'>trace</a>/disp32
<span id="L3598" class="LineNr">3598 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3599" class="LineNr">3599 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L3600" class="LineNr">3600 </span><span class="Constant">$trace-sssns:end</span>:
<span id="L3601" class="LineNr">3601 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L3602" class="LineNr">3602 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L3603" class="LineNr">3603 </span>    5d/pop-to-ebp
<span id="L3604" class="LineNr">3604 </span>    c3/return
<span id="L3605" class="LineNr">3605 </span>
<span id="L3606" class="LineNr">3606 </span><span class="subxTest">test-trace-sssns</span>:
<span id="L3607" class="LineNr">3607 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L3608" class="LineNr">3608 </span>    55/push-ebp
<span id="L3609" class="LineNr">3609 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L3610" class="LineNr">3610 </span>    <span class="subxComment"># setup</span>
<span id="L3611" class="LineNr">3611 </span>    <span class="subxS1Comment"># . *Trace-stream-&gt;write = 0</span>
<span id="L3612" class="LineNr">3612 </span>    8b/copy                         0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   <span class="SpecialChar"><a href='../056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># copy *Trace-stream to eax</span>
<span id="L3613" class="LineNr">3613 </span>    c7          0/subop/copy        0/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0/imm32           <span class="subxComment"># clear *eax</span>
<span id="L3614" class="LineNr">3614 </span>    <span class="subxComment"># trace-sssns(&quot;A&quot; &quot;b&quot; &quot;c &quot; 3 &quot; e&quot;)</span>
<span id="L3615" class="LineNr">3615 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3616" class="LineNr">3616 </span>    68/push  <span class="Constant">&quot; e&quot;</span>/imm32
<span id="L3617" class="LineNr">3617 </span>    68/push  3/imm32
<span id="L3618" class="LineNr">3618 </span>    68/push  <span class="Constant">&quot;c &quot;</span>/imm32
<span id="L3619" class="LineNr">3619 </span>    68/push  <span class="Constant">&quot;b&quot;</span>/imm32
<span id="L3620" class="LineNr">3620 </span>    68/push  <span class="Constant">&quot;A&quot;</span>/imm32
<span id="L3621" class="LineNr">3621 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3622" class="LineNr">3622 </span>    e8/call  <a href='survey.subx.html#L3557'>trace-sssns</a>/disp32
<span id="L3623" class="LineNr">3623 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3624" class="LineNr">3624 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x14/imm32        <span class="subxComment"># add to esp</span>
<span id="L3625" class="Folded">3625 </span><span class="Folded">+-- 26 lines: #?     # dump *Trace-stream --------------------------------------------------------------------------------------------------------------------</span>
<span id="L3651" class="LineNr">3651 </span>    <span class="subxComment"># check-trace-contains(&quot;Abc 0x00000003 e&quot;)</span>
<span id="L3652" class="LineNr">3652 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3653" class="LineNr">3653 </span>    68/push  <span class="Constant">&quot;F - test-trace-sssns&quot;</span>/imm32
<span id="L3654" class="LineNr">3654 </span>    68/push  <span class="Constant">&quot;Abc 0x00000003 e&quot;</span>/imm32
<span id="L3655" class="LineNr">3655 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3656" class="LineNr">3656 </span>    e8/call  <a href='../056trace.subx.html#L253'>check-trace-contains</a>/disp32
<span id="L3657" class="LineNr">3657 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3658" class="LineNr">3658 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L3659" class="LineNr">3659 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L3660" class="LineNr">3660 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L3661" class="LineNr">3661 </span>    5d/pop-to-ebp
<span id="L3662" class="LineNr">3662 </span>    c3/return
<span id="L3663" class="LineNr">3663 </span>
<span id="L3664" class="LineNr">3664 </span><span class="subxFunction">trace-snsns</span>:  <span class="subxComment"># s1 : (addr string), n2 : int, s3 : (addr string), n4 : int, s5 : (addr string)</span>
<span id="L3665" class="LineNr">3665 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L3666" class="LineNr">3666 </span>    55/push-ebp
<span id="L3667" class="LineNr">3667 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L3668" class="LineNr">3668 </span>    <span class="subxComment"># write(*Trace-stream, s1)</span>
<span id="L3669" class="LineNr">3669 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3670" class="LineNr">3670 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+8)</span>
<span id="L3671" class="LineNr">3671 </span>    ff          6/subop/push        0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          <span class="SpecialChar"><a href='../056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># push *Trace-stream</span>
<span id="L3672" class="LineNr">3672 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3673" class="LineNr">3673 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L3674" class="LineNr">3674 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3675" class="LineNr">3675 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L3676" class="LineNr">3676 </span>    <span class="subxComment"># print-int32(*Trace-stream, n2)</span>
<span id="L3677" class="LineNr">3677 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3678" class="LineNr">3678 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+12)</span>
<span id="L3679" class="LineNr">3679 </span>    ff          6/subop/push        0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          <span class="SpecialChar"><a href='../056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># push *Trace-stream</span>
<span id="L3680" class="LineNr">3680 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3681" class="LineNr">3681 </span>    e8/call  <a href='../066print-int.subx.html#L178'>print-int32</a>/disp32
<span id="L3682" class="LineNr">3682 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3683" class="LineNr">3683 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L3684" class="LineNr">3684 </span>    <span class="subxComment"># write(*Trace-stream, s3)</span>
<span id="L3685" class="LineNr">3685 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3686" class="LineNr">3686 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0x10/disp8     <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+16)</span>
<span id="L3687" class="LineNr">3687 </span>    ff          6/subop/push        0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          <span class="SpecialChar"><a href='../056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># push *Trace-stream</span>
<span id="L3688" class="LineNr">3688 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3689" class="LineNr">3689 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L3690" class="LineNr">3690 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3691" class="LineNr">3691 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L3692" class="LineNr">3692 </span>    <span class="subxComment"># print-int32(*Trace-stream, n4)</span>
<span id="L3693" class="LineNr">3693 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3694" class="LineNr">3694 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0x14/disp8     <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+20)</span>
<span id="L3695" class="LineNr">3695 </span>    ff          6/subop/push        0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          <span class="SpecialChar"><a href='../056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># push *Trace-stream</span>
<span id="L3696" class="LineNr">3696 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3697" class="LineNr">3697 </span>    e8/call  <a href='../066print-int.subx.html#L178'>print-int32</a>/disp32
<span id="L3698" class="LineNr">3698 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3699" class="LineNr">3699 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L3700" class="LineNr">3700 </span>    <span class="subxComment"># trace(s5)  # implicitly adds a newline and finalizes the trace line</span>
<span id="L3701" class="LineNr">3701 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3702" class="LineNr">3702 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0x18/disp8     <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+24)</span>
<span id="L3703" class="LineNr">3703 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3704" class="LineNr">3704 </span>    e8/call  <a href='../056trace.subx.html#L86'>trace</a>/disp32
<span id="L3705" class="LineNr">3705 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3706" class="LineNr">3706 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L3707" class="LineNr">3707 </span><span class="Constant">$trace-snsns:end</span>:
<span id="L3708" class="LineNr">3708 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L3709" class="LineNr">3709 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L3710" class="LineNr">3710 </span>    5d/pop-to-ebp
<span id="L3711" class="LineNr">3711 </span>    c3/return
<span id="L3712" class="LineNr">3712 </span>
<span id="L3713" class="LineNr">3713 </span><span class="subxTest">test-trace-snsns</span>:
<span id="L3714" class="LineNr">3714 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L3715" class="LineNr">3715 </span>    55/push-ebp
<span id="L3716" class="LineNr">3716 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L3717" class="LineNr">3717 </span>    <span class="subxComment"># setup</span>
<span id="L3718" class="LineNr">3718 </span>    <span class="subxS1Comment"># . *Trace-stream-&gt;write = 0</span>
<span id="L3719" class="LineNr">3719 </span>    8b/copy                         0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   <span class="SpecialChar"><a href='../056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># copy *Trace-stream to eax</span>
<span id="L3720" class="LineNr">3720 </span>    c7          0/subop/copy        0/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0/imm32           <span class="subxComment"># clear *eax</span>
<span id="L3721" class="LineNr">3721 </span>    <span class="subxComment"># trace-snsns(&quot;A &quot; 2 &quot; c &quot; 3 &quot; e&quot;)</span>
<span id="L3722" class="LineNr">3722 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3723" class="LineNr">3723 </span>    68/push  <span class="Constant">&quot; e&quot;</span>/imm32
<span id="L3724" class="LineNr">3724 </span>    68/push  3/imm32
<span id="L3725" class="LineNr">3725 </span>    68/push  <span class="Constant">&quot; c &quot;</span>/imm32
<span id="L3726" class="LineNr">3726 </span>    68/push  2/imm32
<span id="L3727" class="LineNr">3727 </span>    68/push  <span class="Constant">&quot;A &quot;</span>/imm32
<span id="L3728" class="LineNr">3728 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3729" class="LineNr">3729 </span>    e8/call  <a href='survey.subx.html#L3664'>trace-snsns</a>/disp32
<span id="L3730" class="LineNr">3730 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3731" class="LineNr">3731 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x14/imm32        <span class="subxComment"># add to esp</span>
<span id="L3732" class="Folded">3732 </span><span class="Folded">+-- 26 lines: #?     # dump *Trace-stream --------------------------------------------------------------------------------------------------------------------</span>
<span id="L3758" class="LineNr">3758 </span>    <span class="subxComment"># check-trace-contains(&quot;Abc 0x00000003 e&quot;)</span>
<span id="L3759" class="LineNr">3759 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3760" class="LineNr">3760 </span>    68/push  <span class="Constant">&quot;F - test-trace-snsns&quot;</span>/imm32
<span id="L3761" class="LineNr">3761 </span>    68/push  <span class="Constant">&quot;A 0x00000002 c 0x00000003 e&quot;</span>/imm32
<span id="L3762" class="LineNr">3762 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3763" class="LineNr">3763 </span>    e8/call  <a href='../056trace.subx.html#L253'>check-trace-contains</a>/disp32
<span id="L3764" class="LineNr">3764 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3765" class="LineNr">3765 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L3766" class="LineNr">3766 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L3767" class="LineNr">3767 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L3768" class="LineNr">3768 </span>    5d/pop-to-ebp
<span id="L3769" class="LineNr">3769 </span>    c3/return
<span id="L3770" class="LineNr">3770 </span>
<span id="L3771" class="LineNr">3771 </span><span class="subxFunction">trace-slsls</span>:  <span class="subxComment"># s1 : (addr string), l2 : (addr slice), s3 : (addr string), l4 : (addr slice), s5 : (addr string)</span>
<span id="L3772" class="LineNr">3772 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L3773" class="LineNr">3773 </span>    55/push-ebp
<span id="L3774" class="LineNr">3774 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L3775" class="LineNr">3775 </span>    <span class="subxComment"># write(*Trace-stream, s1)</span>
<span id="L3776" class="LineNr">3776 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3777" class="LineNr">3777 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+8)</span>
<span id="L3778" class="LineNr">3778 </span>    ff          6/subop/push        0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          <span class="SpecialChar"><a href='../056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># push *Trace-stream</span>
<span id="L3779" class="LineNr">3779 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3780" class="LineNr">3780 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L3781" class="LineNr">3781 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3782" class="LineNr">3782 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L3783" class="LineNr">3783 </span>    <span class="subxComment"># write-slice(*Trace-stream, l2)</span>
<span id="L3784" class="LineNr">3784 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3785" class="LineNr">3785 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+12)</span>
<span id="L3786" class="LineNr">3786 </span>    ff          6/subop/push        0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          <span class="SpecialChar"><a href='../056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># push *Trace-stream</span>
<span id="L3787" class="LineNr">3787 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3788" class="LineNr">3788 </span>    e8/call  <a href='../072slice.subx.html#L793'>write-slice</a>/disp32
<span id="L3789" class="LineNr">3789 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3790" class="LineNr">3790 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L3791" class="LineNr">3791 </span>    <span class="subxComment"># write(*Trace-stream, s3)</span>
<span id="L3792" class="LineNr">3792 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3793" class="LineNr">3793 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0x10/disp8     <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+16)</span>
<span id="L3794" class="LineNr">3794 </span>    ff          6/subop/push        0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          <span class="SpecialChar"><a href='../056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># push *Trace-stream</span>
<span id="L3795" class="LineNr">3795 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3796" class="LineNr">3796 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L3797" class="LineNr">3797 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3798" class="LineNr">3798 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L3799" class="LineNr">3799 </span>    <span class="subxComment"># write-slice(*Trace-stream, l4)</span>
<span id="L3800" class="LineNr">3800 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3801" class="LineNr">3801 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0x14/disp8     <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+20)</span>
<span id="L3802" class="LineNr">3802 </span>    ff          6/subop/push        0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          <span class="SpecialChar"><a href='../056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># push *Trace-stream</span>
<span id="L3803" class="LineNr">3803 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3804" class="LineNr">3804 </span>    e8/call  <a href='../072slice.subx.html#L793'>write-slice</a>/disp32
<span id="L3805" class="LineNr">3805 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3806" class="LineNr">3806 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L3807" class="LineNr">3807 </span>    <span class="subxComment"># trace(s5)  # implicitly adds a newline and finalizes the trace line</span>
<span id="L3808" class="LineNr">3808 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3809" class="LineNr">3809 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0x18/disp8     <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+24)</span>
<span id="L3810" class="LineNr">3810 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3811" class="LineNr">3811 </span>    e8/call  <a href='../056trace.subx.html#L86'>trace</a>/disp32
<span id="L3812" class="LineNr">3812 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3813" class="LineNr">3813 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L3814" class="LineNr">3814 </span><span class="Constant">$trace-slsls:end</span>:
<span id="L3815" class="LineNr">3815 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L3816" class="LineNr">3816 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L3817" class="LineNr">3817 </span>    5d/pop-to-ebp
<span id="L3818" class="LineNr">3818 </span>    c3/return
<span id="L3819" class="LineNr">3819 </span>
<span id="L3820" class="LineNr">3820 </span><span class="subxTest">test-trace-slsls</span>:
<span id="L3821" class="LineNr">3821 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L3822" class="LineNr">3822 </span>    55/push-ebp
<span id="L3823" class="LineNr">3823 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L3824" class="LineNr">3824 </span>    <span class="subxComment"># setup</span>
<span id="L3825" class="LineNr">3825 </span>    <span class="subxS1Comment"># . *Trace-stream-&gt;write = 0</span>
<span id="L3826" class="LineNr">3826 </span>    8b/copy                         0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   <span class="SpecialChar"><a href='../056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># copy *Trace-stream to eax</span>
<span id="L3827" class="LineNr">3827 </span>    c7          0/subop/copy        0/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0/imm32           <span class="subxComment"># clear *eax</span>
<span id="L3828" class="LineNr">3828 </span>    <span class="subxComment"># (eax..ecx) = &quot;b&quot;</span>
<span id="L3829" class="LineNr">3829 </span>    b8/copy-to-eax  <span class="Constant">&quot;b&quot;</span>/imm32
<span id="L3830" class="LineNr">3830 </span>    8b/copy                         0/mod/indirect  0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *eax to ecx</span>
<span id="L3831" class="LineNr">3831 </span>    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    0/base/eax  1/index/ecx  <span class="Normal"> . </span>          1/r32/ecx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy eax+ecx+4 to ecx</span>
<span id="L3832" class="LineNr">3832 </span>    05/add-to-eax  4/imm32
<span id="L3833" class="LineNr">3833 </span>    <span class="subxComment"># var b/ebx : slice = {eax, ecx}</span>
<span id="L3834" class="LineNr">3834 </span>    51/push-ecx
<span id="L3835" class="LineNr">3835 </span>    50/push-eax
<span id="L3836" class="LineNr">3836 </span>    89/copy                         3/mod/direct    3/rm32/ebx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebx</span>
<span id="L3837" class="LineNr">3837 </span>    <span class="subxComment"># (eax..ecx) = &quot;d&quot;</span>
<span id="L3838" class="LineNr">3838 </span>    b8/copy-to-eax  <span class="Constant">&quot;d&quot;</span>/imm32
<span id="L3839" class="LineNr">3839 </span>    8b/copy                         0/mod/indirect  0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *eax to ecx</span>
<span id="L3840" class="LineNr">3840 </span>    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    0/base/eax  1/index/ecx  <span class="Normal"> . </span>          1/r32/ecx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy eax+ecx+4 to ecx</span>
<span id="L3841" class="LineNr">3841 </span>    05/add-to-eax  4/imm32
<span id="L3842" class="LineNr">3842 </span>    <span class="subxComment"># var d/edx : slice = {eax, ecx}</span>
<span id="L3843" class="LineNr">3843 </span>    51/push-ecx
<span id="L3844" class="LineNr">3844 </span>    50/push-eax
<span id="L3845" class="LineNr">3845 </span>    89/copy                         3/mod/direct    2/rm32/edx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to edx</span>
<span id="L3846" class="LineNr">3846 </span>    <span class="subxComment"># trace-slsls(&quot;A&quot; b &quot;c&quot; d &quot;e&quot;)</span>
<span id="L3847" class="LineNr">3847 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3848" class="LineNr">3848 </span>    68/push  <span class="Constant">&quot;e&quot;</span>/imm32
<span id="L3849" class="LineNr">3849 </span>    52/push-edx
<span id="L3850" class="LineNr">3850 </span>    68/push  <span class="Constant">&quot;c&quot;</span>/imm32
<span id="L3851" class="LineNr">3851 </span>    53/push-ebx
<span id="L3852" class="LineNr">3852 </span>    68/push  <span class="Constant">&quot;A&quot;</span>/imm32
<span id="L3853" class="LineNr">3853 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3854" class="LineNr">3854 </span>    e8/call  <a href='survey.subx.html#L3771'>trace-slsls</a>/disp32
<span id="L3855" class="LineNr">3855 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3856" class="LineNr">3856 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x14/imm32        <span class="subxComment"># add to esp</span>
<span id="L3857" class="Folded">3857 </span><span class="Folded">+-- 26 lines: #?     # dump *Trace-stream --------------------------------------------------------------------------------------------------------------------</span>
<span id="L3883" class="LineNr">3883 </span>    <span class="subxComment"># check-trace-contains(&quot;Abcde&quot;)</span>
<span id="L3884" class="LineNr">3884 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3885" class="LineNr">3885 </span>    68/push  <span class="Constant">&quot;F - test-trace-slsls&quot;</span>/imm32
<span id="L3886" class="LineNr">3886 </span>    68/push  <span class="Constant">&quot;Abcde&quot;</span>/imm32
<span id="L3887" class="LineNr">3887 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3888" class="LineNr">3888 </span>    e8/call  <a href='../056trace.subx.html#L253'>check-trace-contains</a>/disp32
<span id="L3889" class="LineNr">3889 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3890" class="LineNr">3890 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L3891" class="LineNr">3891 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L3892" class="LineNr">3892 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L3893" class="LineNr">3893 </span>    5d/pop-to-ebp
<span id="L3894" class="LineNr">3894 </span>    c3/return
<span id="L3895" class="LineNr">3895 </span>
<span id="L3896" class="LineNr">3896 </span><span class="subxFunction">trace-slsns</span>:  <span class="subxComment"># s1 : (addr string), l2 : (addr slice), s3 : (addr string), n4 : int, s5 : (addr string)</span>
<span id="L3897" class="LineNr">3897 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L3898" class="LineNr">3898 </span>    55/push-ebp
<span id="L3899" class="LineNr">3899 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L3900" class="LineNr">3900 </span>    <span class="subxComment"># write(*Trace-stream, s1)</span>
<span id="L3901" class="LineNr">3901 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3902" class="LineNr">3902 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+8)</span>
<span id="L3903" class="LineNr">3903 </span>    ff          6/subop/push        0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          <span class="SpecialChar"><a href='../056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># push *Trace-stream</span>
<span id="L3904" class="LineNr">3904 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3905" class="LineNr">3905 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L3906" class="LineNr">3906 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3907" class="LineNr">3907 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L3908" class="LineNr">3908 </span>    <span class="subxComment"># write-slice(*Trace-stream, l2)</span>
<span id="L3909" class="LineNr">3909 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3910" class="LineNr">3910 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+12)</span>
<span id="L3911" class="LineNr">3911 </span>    ff          6/subop/push        0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          <span class="SpecialChar"><a href='../056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># push *Trace-stream</span>
<span id="L3912" class="LineNr">3912 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3913" class="LineNr">3913 </span>    e8/call  <a href='../072slice.subx.html#L793'>write-slice</a>/disp32
<span id="L3914" class="LineNr">3914 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3915" class="LineNr">3915 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L3916" class="LineNr">3916 </span>    <span class="subxComment"># write(*Trace-stream, s3)</span>
<span id="L3917" class="LineNr">3917 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3918" class="LineNr">3918 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0x10/disp8     <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+16)</span>
<span id="L3919" class="LineNr">3919 </span>    ff          6/subop/push        0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          <span class="SpecialChar"><a href='../056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># push *Trace-stream</span>
<span id="L3920" class="LineNr">3920 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3921" class="LineNr">3921 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L3922" class="LineNr">3922 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3923" class="LineNr">3923 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L3924" class="LineNr">3924 </span>    <span class="subxComment"># print-int32(*Trace-stream, n4)</span>
<span id="L3925" class="LineNr">3925 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3926" class="LineNr">3926 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0x14/disp8     <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+20)</span>
<span id="L3927" class="LineNr">3927 </span>    ff          6/subop/push        0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          <span class="SpecialChar"><a href='../056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># push *Trace-stream</span>
<span id="L3928" class="LineNr">3928 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3929" class="LineNr">3929 </span>    e8/call  <a href='../066print-int.subx.html#L178'>print-int32</a>/disp32
<span id="L3930" class="LineNr">3930 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3931" class="LineNr">3931 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L3932" class="LineNr">3932 </span>    <span class="subxComment"># trace(s5)  # implicitly adds a newline and finalizes the trace line</span>
<span id="L3933" class="LineNr">3933 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3934" class="LineNr">3934 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0x18/disp8     <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+24)</span>
<span id="L3935" class="LineNr">3935 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3936" class="LineNr">3936 </span>    e8/call  <a href='../056trace.subx.html#L86'>trace</a>/disp32
<span id="L3937" class="LineNr">3937 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3938" class="LineNr">3938 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L3939" class="LineNr">3939 </span><span class="Constant">$trace-slsns:end</span>:
<span id="L3940" class="LineNr">3940 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L3941" class="LineNr">3941 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L3942" class="LineNr">3942 </span>    5d/pop-to-ebp
<span id="L3943" class="LineNr">3943 </span>    c3/return
<span id="L3944" class="LineNr">3944 </span>
<span id="L3945" class="LineNr">3945 </span><span class="subxTest">test-trace-slsns</span>:
<span id="L3946" class="LineNr">3946 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L3947" class="LineNr">3947 </span>    55/push-ebp
<span id="L3948" class="LineNr">3948 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L3949" class="LineNr">3949 </span>    <span class="subxComment"># setup</span>
<span id="L3950" class="LineNr">3950 </span>    <span class="subxS1Comment"># . *Trace-stream-&gt;write = 0</span>
<span id="L3951" class="LineNr">3951 </span>    8b/copy                         0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   <span class="SpecialChar"><a href='../056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># copy *Trace-stream to eax</span>
<span id="L3952" class="LineNr">3952 </span>    c7          0/subop/copy        0/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0/imm32           <span class="subxComment"># clear *eax</span>
<span id="L3953" class="LineNr">3953 </span>    <span class="subxComment"># (eax..ecx) = &quot;b&quot;</span>
<span id="L3954" class="LineNr">3954 </span>    b8/copy-to-eax  <span class="Constant">&quot;b&quot;</span>/imm32
<span id="L3955" class="LineNr">3955 </span>    8b/copy                         0/mod/indirect  0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *eax to ecx</span>
<span id="L3956" class="LineNr">3956 </span>    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    0/base/eax  1/index/ecx  <span class="Normal"> . </span>          1/r32/ecx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy eax+ecx+4 to ecx</span>
<span id="L3957" class="LineNr">3957 </span>    05/add-to-eax  4/imm32
<span id="L3958" class="LineNr">3958 </span>    <span class="subxComment"># var b/ebx : slice = {eax, ecx}</span>
<span id="L3959" class="LineNr">3959 </span>    51/push-ecx
<span id="L3960" class="LineNr">3960 </span>    50/push-eax
<span id="L3961" class="LineNr">3961 </span>    89/copy                         3/mod/direct    3/rm32/ebx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebx</span>
<span id="L3962" class="LineNr">3962 </span>    <span class="subxComment"># trace-slsls(&quot;A&quot; b &quot;c &quot; 3 &quot; e&quot;)</span>
<span id="L3963" class="LineNr">3963 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L3964" class="LineNr">3964 </span>    68/push  <span class="Constant">&quot; e&quot;</span>/imm32
<span id="L3965" class="LineNr">3965 </span>    68/push  3/imm32
<span id="L3966" class="LineNr">3966 </span>    68/push  <span class="Constant">&quot;c &quot;</span>/imm32
<span id="L3967" class="LineNr">3967 </span>    53/push-ebx
<span id="L3968" class="LineNr">3968 </span>    68/push  <span class="Constant">&quot;A&quot;</span>/imm32
<span id="L3969" class="LineNr">3969 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L3970" class="LineNr">3970 </span>    e8/call  <a href='survey.subx.html#L3896'>trace-slsns</a>/disp32
<span id="L3971" class="LineNr">3971 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L3972" class="LineNr">3972 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x14/imm32        <span class="subxComment"># add to esp</span>
<span id="L3973" class="Folded">3973 </span><span class="Folded">+-- 26 lines: #?     # dump *Trace-stream --------------------------------------------------------------------------------------------------------------------</span>
<span id="L3999" class="LineNr">3999 </span>    <span class="subxComment"># check-trace-contains(&quot;Abc 0x00000003 e&quot;)</span>
<span id="L4000" class="LineNr">4000 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4001" class="LineNr">4001 </span>    68/push  <span class="Constant">&quot;F - test-trace-slsls&quot;</span>/imm32
<span id="L4002" class="LineNr">4002 </span>    68/push  <span class="Constant">&quot;Abc 0x00000003 e&quot;</span>/imm32
<span id="L4003" class="LineNr">4003 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4004" class="LineNr">4004 </span>    e8/call  <a href='../056trace.subx.html#L253'>check-trace-contains</a>/disp32
<span id="L4005" class="LineNr">4005 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4006" class="LineNr">4006 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L4007" class="LineNr">4007 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L4008" class="LineNr">4008 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L4009" class="LineNr">4009 </span>    5d/pop-to-ebp
<span id="L4010" class="LineNr">4010 </span>    c3/return
<span id="L4011" class="LineNr">4011 </span>
<span id="L4012" class="LineNr">4012 </span><span class="subxFunction">trace-slsss</span>:  <span class="subxComment"># s1 : (addr string), l2 : (addr slice), s3 : (addr string), s4 : (addr string), s5 : (addr string)</span>
<span id="L4013" class="LineNr">4013 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L4014" class="LineNr">4014 </span>    55/push-ebp
<span id="L4015" class="LineNr">4015 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L4016" class="LineNr">4016 </span>    <span class="subxComment"># write(*Trace-stream, s1)</span>
<span id="L4017" class="LineNr">4017 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4018" class="LineNr">4018 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+8)</span>
<span id="L4019" class="LineNr">4019 </span>    ff          6/subop/push        0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          <span class="SpecialChar"><a href='../056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># push *Trace-stream</span>
<span id="L4020" class="LineNr">4020 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4021" class="LineNr">4021 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L4022" class="LineNr">4022 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4023" class="LineNr">4023 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L4024" class="LineNr">4024 </span>    <span class="subxComment"># write-slice(*Trace-stream, l2)</span>
<span id="L4025" class="LineNr">4025 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4026" class="LineNr">4026 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+12)</span>
<span id="L4027" class="LineNr">4027 </span>    ff          6/subop/push        0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          <span class="SpecialChar"><a href='../056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># push *Trace-stream</span>
<span id="L4028" class="LineNr">4028 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4029" class="LineNr">4029 </span>    e8/call  <a href='../072slice.subx.html#L793'>write-slice</a>/disp32
<span id="L4030" class="LineNr">4030 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4031" class="LineNr">4031 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L4032" class="LineNr">4032 </span>    <span class="subxComment"># write(*Trace-stream, s3)</span>
<span id="L4033" class="LineNr">4033 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4034" class="LineNr">4034 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0x10/disp8     <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+16)</span>
<span id="L4035" class="LineNr">4035 </span>    ff          6/subop/push        0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          <span class="SpecialChar"><a href='../056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># push *Trace-stream</span>
<span id="L4036" class="LineNr">4036 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4037" class="LineNr">4037 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L4038" class="LineNr">4038 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4039" class="LineNr">4039 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L4040" class="LineNr">4040 </span>    <span class="subxComment"># write(*Trace-stream, s4)</span>
<span id="L4041" class="LineNr">4041 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4042" class="LineNr">4042 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0x14/disp8     <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+20)</span>
<span id="L4043" class="LineNr">4043 </span>    ff          6/subop/push        0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          <span class="SpecialChar"><a href='../056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># push *Trace-stream</span>
<span id="L4044" class="LineNr">4044 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4045" class="LineNr">4045 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L4046" class="LineNr">4046 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4047" class="LineNr">4047 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L4048" class="LineNr">4048 </span>    <span class="subxComment"># trace(s5)  # implicitly adds a newline and finalizes the trace line</span>
<span id="L4049" class="LineNr">4049 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4050" class="LineNr">4050 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0x18/disp8     <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+24)</span>
<span id="L4051" class="LineNr">4051 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4052" class="LineNr">4052 </span>    e8/call  <a href='../056trace.subx.html#L86'>trace</a>/disp32
<span id="L4053" class="LineNr">4053 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4054" class="LineNr">4054 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L4055" class="LineNr">4055 </span><span class="Constant">$trace-slsss:end</span>:
<span id="L4056" class="LineNr">4056 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L4057" class="LineNr">4057 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L4058" class="LineNr">4058 </span>    5d/pop-to-ebp
<span id="L4059" class="LineNr">4059 </span>    c3/return
<span id="L4060" class="LineNr">4060 </span>
<span id="L4061" class="LineNr">4061 </span><span class="subxTest">test-trace-slsss</span>:
<span id="L4062" class="LineNr">4062 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L4063" class="LineNr">4063 </span>    55/push-ebp
<span id="L4064" class="LineNr">4064 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L4065" class="LineNr">4065 </span>    <span class="subxComment"># setup</span>
<span id="L4066" class="LineNr">4066 </span>    <span class="subxS1Comment"># . *Trace-stream-&gt;write = 0</span>
<span id="L4067" class="LineNr">4067 </span>    8b/copy                         0/mod/indirect  5/rm32/.disp32           <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   <span class="SpecialChar"><a href='../056trace.subx.html#L21'>Trace-stream</a></span>/disp32               <span class="subxComment"># copy *Trace-stream to eax</span>
<span id="L4068" class="LineNr">4068 </span>    c7          0/subop/copy        0/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0/imm32           <span class="subxComment"># clear *eax</span>
<span id="L4069" class="LineNr">4069 </span>    <span class="subxComment"># (eax..ecx) = &quot;b&quot;</span>
<span id="L4070" class="LineNr">4070 </span>    b8/copy-to-eax  <span class="Constant">&quot;b&quot;</span>/imm32
<span id="L4071" class="LineNr">4071 </span>    8b/copy                         0/mod/indirect  0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *eax to ecx</span>
<span id="L4072" class="LineNr">4072 </span>    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    0/base/eax  1/index/ecx  <span class="Normal"> . </span>          1/r32/ecx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy eax+ecx+4 to ecx</span>
<span id="L4073" class="LineNr">4073 </span>    05/add-to-eax  4/imm32
<span id="L4074" class="LineNr">4074 </span>    <span class="subxComment"># var b/ebx : slice = {eax, ecx}</span>
<span id="L4075" class="LineNr">4075 </span>    51/push-ecx
<span id="L4076" class="LineNr">4076 </span>    50/push-eax
<span id="L4077" class="LineNr">4077 </span>    89/copy                         3/mod/direct    3/rm32/ebx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebx</span>
<span id="L4078" class="LineNr">4078 </span>    <span class="subxComment"># trace-slsss(&quot;A&quot; b &quot;c&quot; &quot;d&quot; &quot;e&quot;)</span>
<span id="L4079" class="LineNr">4079 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4080" class="LineNr">4080 </span>    68/push  <span class="Constant">&quot;e&quot;</span>/imm32
<span id="L4081" class="LineNr">4081 </span>    68/push  <span class="Constant">&quot;d&quot;</span>/imm32
<span id="L4082" class="LineNr">4082 </span>    68/push  <span class="Constant">&quot;c&quot;</span>/imm32
<span id="L4083" class="LineNr">4083 </span>    53/push-ebx
<span id="L4084" class="LineNr">4084 </span>    68/push  <span class="Constant">&quot;A&quot;</span>/imm32
<span id="L4085" class="LineNr">4085 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4086" class="LineNr">4086 </span>    e8/call  <a href='survey.subx.html#L4012'>trace-slsss</a>/disp32
<span id="L4087" class="LineNr">4087 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4088" class="LineNr">4088 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x14/imm32        <span class="subxComment"># add to esp</span>
<span id="L4089" class="Folded">4089 </span><span class="Folded">+-- 26 lines: #?     # dump *Trace-stream --------------------------------------------------------------------------------------------------------------------</span>
<span id="L4115" class="LineNr">4115 </span>    <span class="subxComment"># check-trace-contains(&quot;Abcde&quot;)</span>
<span id="L4116" class="LineNr">4116 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4117" class="LineNr">4117 </span>    68/push  <span class="Constant">&quot;F - test-trace-slsss&quot;</span>/imm32
<span id="L4118" class="LineNr">4118 </span>    68/push  <span class="Constant">&quot;Abcde&quot;</span>/imm32
<span id="L4119" class="LineNr">4119 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4120" class="LineNr">4120 </span>    e8/call  <a href='../056trace.subx.html#L253'>check-trace-contains</a>/disp32
<span id="L4121" class="LineNr">4121 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4122" class="LineNr">4122 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L4123" class="LineNr">4123 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L4124" class="LineNr">4124 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L4125" class="LineNr">4125 </span>    5d/pop-to-ebp
<span id="L4126" class="LineNr">4126 </span>    c3/return
<span id="L4127" class="LineNr">4127 </span>
<span id="L4128" class="LineNr">4128 </span><span class="subxFunction">num-bytes</span>:  <span class="subxComment"># line : (addr stream byte) -&gt; eax : int</span>
<span id="L4129" class="LineNr">4129 </span>    <span class="subxComment"># pseudocode:</span>
<span id="L4130" class="LineNr">4130 </span>    <span class="subxComment">#   result = 0</span>
<span id="L4131" class="LineNr">4131 </span>    <span class="subxComment">#   while true</span>
<span id="L4132" class="LineNr">4132 </span>    <span class="subxComment">#     var word-slice = next-word(line)</span>
<span id="L4133" class="LineNr">4133 </span>    <span class="subxComment">#     if slice-empty?(word-slice)             # end of line</span>
<span id="L4134" class="LineNr">4134 </span>    <span class="subxComment">#       break</span>
<span id="L4135" class="LineNr">4135 </span>    <span class="subxComment">#     if slice-starts-with?(word-slice, &quot;#&quot;)  # comment</span>
<span id="L4136" class="LineNr">4136 </span>    <span class="subxComment">#       break</span>
<span id="L4137" class="LineNr">4137 </span>    <span class="subxComment">#     if is-label?(word-slice)                # no need for label declarations anymore</span>
<span id="L4138" class="LineNr">4138 </span>    <span class="subxComment">#       break</span>
<span id="L4139" class="LineNr">4139 </span>    <span class="subxComment">#     if slice-equal?(word-slice, &quot;==&quot;)</span>
<span id="L4140" class="LineNr">4140 </span>    <span class="subxComment">#       break                                 # no need for segment header lines</span>
<span id="L4141" class="LineNr">4141 </span>    <span class="subxComment">#     result += compute-width(word-slice)</span>
<span id="L4142" class="LineNr">4142 </span>    <span class="subxComment">#   return result</span>
<span id="L4143" class="LineNr">4143 </span>    <span class="subxComment">#</span>
<span id="L4144" class="LineNr">4144 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L4145" class="LineNr">4145 </span>    55/push-ebp
<span id="L4146" class="LineNr">4146 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L4147" class="LineNr">4147 </span>    <span class="subxS1Comment"># . save registers</span>
<span id="L4148" class="LineNr">4148 </span>    51/push-ecx
<span id="L4149" class="LineNr">4149 </span>    52/push-edx
<span id="L4150" class="LineNr">4150 </span>    53/push-ebx
<span id="L4151" class="LineNr">4151 </span>    <span class="subxComment"># var result/eax = 0</span>
<span id="L4152" class="LineNr">4152 </span>    31/xor                          3/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># clear eax</span>
<span id="L4153" class="LineNr">4153 </span>    <span class="subxComment"># var word-slice/ecx : slice</span>
<span id="L4154" class="LineNr">4154 </span>    68/push  0/imm32/end
<span id="L4155" class="LineNr">4155 </span>    68/push  0/imm32/start
<span id="L4156" class="LineNr">4156 </span>    89/copy                         3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ecx</span>
<span id="L4157" class="Folded">4157 </span><span class="Folded">+-- 26 lines: #?     # dump line -----------------------------------------------------------------------------------------------------------------------------</span>
<span id="L4183" class="LineNr">4183 </span>    <span class="subxS1Comment"># . rewind-stream(line)</span>
<span id="L4184" class="LineNr">4184 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4185" class="LineNr">4185 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+8)</span>
<span id="L4186" class="LineNr">4186 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4187" class="LineNr">4187 </span>    e8/call  <a href='../055stream.subx.html#L54'>rewind-stream</a>/disp32
<span id="L4188" class="LineNr">4188 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4189" class="LineNr">4189 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L4190" class="LineNr">4190 </span><span class="Constant">$num-bytes:loop</span>:
<span id="L4191" class="LineNr">4191 </span>    <span class="subxComment"># next-word(line, word-slice)</span>
<span id="L4192" class="LineNr">4192 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4193" class="LineNr">4193 </span>    51/push-ecx
<span id="L4194" class="LineNr">4194 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+8)</span>
<span id="L4195" class="LineNr">4195 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4196" class="LineNr">4196 </span>    e8/call  <a href='../076next-word.subx.html#L10'>next-word</a>/disp32
<span id="L4197" class="LineNr">4197 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4198" class="LineNr">4198 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L4199" class="Folded">4199 </span><span class="Folded">+-- 40 lines: #?     # dump word-slice -----------------------------------------------------------------------------------------------------------------------</span>
<span id="L4239" class="LineNr">4239 </span><span class="Constant">$num-bytes:check0</span>:
<span id="L4240" class="LineNr">4240 </span>    <span class="subxComment"># if (slice-empty?(word-slice)) break</span>
<span id="L4241" class="LineNr">4241 </span>    <span class="subxS1Comment"># . save result</span>
<span id="L4242" class="LineNr">4242 </span>    50/push-eax
<span id="L4243" class="LineNr">4243 </span>    <span class="subxS1Comment"># . eax = slice-empty?(word-slice)</span>
<span id="L4244" class="LineNr">4244 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4245" class="LineNr">4245 </span>    51/push-ecx
<span id="L4246" class="LineNr">4246 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4247" class="LineNr">4247 </span>    e8/call  <a href='../072slice.subx.html#L9'>slice-empty?</a>/disp32
<span id="L4248" class="LineNr">4248 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4249" class="LineNr">4249 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L4250" class="LineNr">4250 </span>    <span class="subxS1Comment"># . if (eax != false) break</span>
<span id="L4251" class="LineNr">4251 </span>    3d/compare-eax-and  0/imm32/false
<span id="L4252" class="LineNr">4252 </span>    <span class="subxS1Comment"># . restore result now that ZF is set</span>
<span id="L4253" class="LineNr">4253 </span>    58/pop-to-eax
<span id="L4254" class="LineNr">4254 </span>    75/jump-if-!=  $num-bytes:end/disp8
<span id="L4255" class="LineNr">4255 </span><span class="Constant">$num-bytes:check-for-comment</span>:
<span id="L4256" class="LineNr">4256 </span>    <span class="subxComment"># if (slice-starts-with?(word-slice, &quot;#&quot;)) break</span>
<span id="L4257" class="LineNr">4257 </span>    <span class="subxS1Comment"># . start/edx = word-slice-&gt;start</span>
<span id="L4258" class="LineNr">4258 </span>    8b/copy                         0/mod/indirect  1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          2/r32/edx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *ecx to edx</span>
<span id="L4259" class="LineNr">4259 </span>    <span class="subxS1Comment"># . c/ebx = *start</span>
<span id="L4260" class="LineNr">4260 </span>    31/xor                          3/mod/direct    3/rm32/ebx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          3/r32/ebx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># clear ebx</span>
<span id="L4261" class="LineNr">4261 </span>    8a/copy-byte                    0/mod/indirect  2/rm32/edx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          3/r32/BL   <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy byte at *edx to BL</span>
<span id="L4262" class="LineNr">4262 </span>    <span class="subxS1Comment"># . if (ebx == '#') break</span>
<span id="L4263" class="LineNr">4263 </span>    81          7/subop/compare     3/mod/direct    3/rm32/ebx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x23/imm32/hash   <span class="subxComment"># compare ebx</span>
<span id="L4264" class="LineNr">4264 </span>    74/jump-if-=  $num-bytes:end/disp8
<span id="L4265" class="LineNr">4265 </span><span class="Constant">$num-bytes:check-for-label</span>:
<span id="L4266" class="LineNr">4266 </span>    <span class="subxComment"># if (slice-ends-with?(word-slice, &quot;:&quot;)) break</span>
<span id="L4267" class="LineNr">4267 </span>    <span class="subxS1Comment"># . end/edx = word-slice-&gt;end</span>
<span id="L4268" class="LineNr">4268 </span>    8b/copy                         1/mod/*+disp8   1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          2/r32/edx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(ecx+4) to edx</span>
<span id="L4269" class="LineNr">4269 </span>    <span class="subxS1Comment"># . c/ebx = *(end-1)</span>
<span id="L4270" class="LineNr">4270 </span>    31/xor                          3/mod/direct    3/rm32/ebx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          3/r32/ebx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># clear ebx</span>
<span id="L4271" class="LineNr">4271 </span>    8a/copy-byte                    1/mod/*+disp8   2/rm32/edx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          3/r32/BL    -1/disp8       <span class="Normal"> . </span>                <span class="subxComment"># copy byte at *ecx to BL</span>
<span id="L4272" class="LineNr">4272 </span>    <span class="subxS1Comment"># . if (ebx == ':') break</span>
<span id="L4273" class="LineNr">4273 </span>    81          7/subop/compare     3/mod/direct    3/rm32/ebx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0x3a/imm32/colon  <span class="subxComment"># compare ebx</span>
<span id="L4274" class="LineNr">4274 </span>    74/jump-if-=  $num-bytes:end/disp8
<span id="L4275" class="LineNr">4275 </span><span class="Constant">$num-bytes:check-for-segment-header</span>:
<span id="L4276" class="LineNr">4276 </span>    <span class="subxComment"># if (slice-equal?(word-slice, &quot;==&quot;)) break</span>
<span id="L4277" class="LineNr">4277 </span>    <span class="subxS1Comment"># . push result</span>
<span id="L4278" class="LineNr">4278 </span>    50/push-eax
<span id="L4279" class="LineNr">4279 </span>    <span class="subxS1Comment"># . eax = slice-equal?(word-slice, &quot;==&quot;)</span>
<span id="L4280" class="LineNr">4280 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4281" class="LineNr">4281 </span>    68/push  <span class="Constant">&quot;==&quot;</span>/imm32
<span id="L4282" class="LineNr">4282 </span>    51/push-ecx
<span id="L4283" class="LineNr">4283 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4284" class="LineNr">4284 </span>    e8/call  <a href='../072slice.subx.html#L120'>slice-equal?</a>/disp32
<span id="L4285" class="LineNr">4285 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4286" class="LineNr">4286 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L4287" class="LineNr">4287 </span>    <span class="subxS1Comment"># . if (eax != false) break</span>
<span id="L4288" class="LineNr">4288 </span>    3d/compare-eax-and  0/imm32/false
<span id="L4289" class="LineNr">4289 </span>    <span class="subxS1Comment"># . restore result now that ZF is set</span>
<span id="L4290" class="LineNr">4290 </span>    58/pop-to-eax
<span id="L4291" class="LineNr">4291 </span>    75/jump-if-!=  $num-bytes:end/disp8
<span id="L4292" class="LineNr">4292 </span><span class="Constant">$num-bytes:loop-body</span>:
<span id="L4293" class="LineNr">4293 </span>    <span class="subxComment"># result += compute-width-of-slice(word-slice)</span>
<span id="L4294" class="LineNr">4294 </span>    <span class="subxS1Comment"># . copy result to edx</span>
<span id="L4295" class="LineNr">4295 </span>    89/copy                         3/mod/direct    2/rm32/edx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy eax to edx</span>
<span id="L4296" class="LineNr">4296 </span>    <span class="subxS1Comment"># . eax = compute-width-of-slice(word-slice)</span>
<span id="L4297" class="LineNr">4297 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4298" class="LineNr">4298 </span>    51/push-ecx
<span id="L4299" class="LineNr">4299 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4300" class="LineNr">4300 </span>    e8/call <a href='../083subx-widths.subx.html#L45'>compute-width-of-slice</a>/disp32
<span id="L4301" class="LineNr">4301 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4302" class="LineNr">4302 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L4303" class="LineNr">4303 </span>    <span class="subxS1Comment"># . eax += result</span>
<span id="L4304" class="LineNr">4304 </span>    01/add                          3/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          2/r32/edx  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># add edx to eax</span>
<span id="L4305" class="LineNr">4305 </span>    e9/jump  $num-bytes:<span class="Constant">loop</span>/disp32
<span id="L4306" class="LineNr">4306 </span><span class="Constant">$num-bytes:end</span>:
<span id="L4307" class="LineNr">4307 </span>    <span class="subxS1Comment"># . rewind-stream(line)</span>
<span id="L4308" class="LineNr">4308 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4309" class="LineNr">4309 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+8)</span>
<span id="L4310" class="LineNr">4310 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4311" class="LineNr">4311 </span>    e8/call  <a href='../055stream.subx.html#L54'>rewind-stream</a>/disp32
<span id="L4312" class="LineNr">4312 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4313" class="LineNr">4313 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L4314" class="LineNr">4314 </span>    <span class="subxS1Comment"># . reclaim locals</span>
<span id="L4315" class="LineNr">4315 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L4316" class="LineNr">4316 </span>    <span class="subxS1Comment"># . restore registers</span>
<span id="L4317" class="LineNr">4317 </span>    5b/pop-to-ebx
<span id="L4318" class="LineNr">4318 </span>    5a/pop-to-edx
<span id="L4319" class="LineNr">4319 </span>    59/pop-to-ecx
<span id="L4320" class="LineNr">4320 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L4321" class="LineNr">4321 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L4322" class="LineNr">4322 </span>    5d/pop-to-ebp
<span id="L4323" class="LineNr">4323 </span>    c3/return
<span id="L4324" class="LineNr">4324 </span>
<span id="L4325" class="LineNr">4325 </span><span class="subxTest">test-num-bytes-handles-empty-string</span>:
<span id="L4326" class="LineNr">4326 </span>    <span class="subxComment"># if a line starts with '#', return 0</span>
<span id="L4327" class="LineNr">4327 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L4328" class="LineNr">4328 </span>    55/push-ebp
<span id="L4329" class="LineNr">4329 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L4330" class="LineNr">4330 </span>    <span class="subxComment"># setup</span>
<span id="L4331" class="LineNr">4331 </span>    <span class="subxS1Comment"># . clear-stream(_test-input-stream)</span>
<span id="L4332" class="LineNr">4332 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4333" class="LineNr">4333 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L4334" class="LineNr">4334 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4335" class="LineNr">4335 </span>    e8/call  <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L4336" class="LineNr">4336 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4337" class="LineNr">4337 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L4338" class="LineNr">4338 </span>    <span class="subxS1Comment"># . clear-stream(_test-output-stream)</span>
<span id="L4339" class="LineNr">4339 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4340" class="LineNr">4340 </span>    68/push  <a href='../064write-byte.subx.html#L286'>_test-output-stream</a>/imm32
<span id="L4341" class="LineNr">4341 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4342" class="LineNr">4342 </span>    e8/call  <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L4343" class="LineNr">4343 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4344" class="LineNr">4344 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L4345" class="LineNr">4345 </span>    <span class="subxComment"># no contents in input</span>
<span id="L4346" class="LineNr">4346 </span>    <span class="subxComment"># eax = num-bytes(_test-input-stream)</span>
<span id="L4347" class="LineNr">4347 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4348" class="LineNr">4348 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L4349" class="LineNr">4349 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4350" class="LineNr">4350 </span>    e8/call  <a href='survey.subx.html#L4128'>num-bytes</a>/disp32
<span id="L4351" class="LineNr">4351 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4352" class="LineNr">4352 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L4353" class="LineNr">4353 </span>    <span class="subxComment"># check-ints-equal(eax, 0, msg)</span>
<span id="L4354" class="LineNr">4354 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4355" class="LineNr">4355 </span>    68/push  <span class="Constant">&quot;F - test-num-bytes-handles-empty-string&quot;</span>/imm32
<span id="L4356" class="LineNr">4356 </span>    68/push  0/imm32/true
<span id="L4357" class="LineNr">4357 </span>    50/push-eax
<span id="L4358" class="LineNr">4358 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4359" class="LineNr">4359 </span>    e8/call  <a href='../051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L4360" class="LineNr">4360 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4361" class="LineNr">4361 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L4362" class="LineNr">4362 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L4363" class="LineNr">4363 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L4364" class="LineNr">4364 </span>    5d/pop-to-ebp
<span id="L4365" class="LineNr">4365 </span>    c3/return
<span id="L4366" class="LineNr">4366 </span>
<span id="L4367" class="LineNr">4367 </span><span class="subxTest">test-num-bytes-ignores-comments</span>:
<span id="L4368" class="LineNr">4368 </span>    <span class="subxComment"># if a line starts with '#', return 0</span>
<span id="L4369" class="LineNr">4369 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L4370" class="LineNr">4370 </span>    55/push-ebp
<span id="L4371" class="LineNr">4371 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L4372" class="LineNr">4372 </span>    <span class="subxComment"># setup</span>
<span id="L4373" class="LineNr">4373 </span>    <span class="subxS1Comment"># . clear-stream(_test-input-stream)</span>
<span id="L4374" class="LineNr">4374 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4375" class="LineNr">4375 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L4376" class="LineNr">4376 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4377" class="LineNr">4377 </span>    e8/call  <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L4378" class="LineNr">4378 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4379" class="LineNr">4379 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L4380" class="LineNr">4380 </span>    <span class="subxS1Comment"># . clear-stream(_test-output-stream)</span>
<span id="L4381" class="LineNr">4381 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4382" class="LineNr">4382 </span>    68/push  <a href='../064write-byte.subx.html#L286'>_test-output-stream</a>/imm32
<span id="L4383" class="LineNr">4383 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4384" class="LineNr">4384 </span>    e8/call  <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L4385" class="LineNr">4385 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4386" class="LineNr">4386 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L4387" class="LineNr">4387 </span>    <span class="subxComment"># initialize input</span>
<span id="L4388" class="LineNr">4388 </span>    <span class="subxS1Comment"># . write(_test-input-stream, &quot;# abcd&quot;)</span>
<span id="L4389" class="LineNr">4389 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4390" class="LineNr">4390 </span>    68/push  <span class="Constant">&quot;# abcd&quot;</span>/imm32
<span id="L4391" class="LineNr">4391 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L4392" class="LineNr">4392 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4393" class="LineNr">4393 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L4394" class="LineNr">4394 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4395" class="LineNr">4395 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L4396" class="LineNr">4396 </span>    <span class="subxComment"># eax = num-bytes(_test-input-stream)</span>
<span id="L4397" class="LineNr">4397 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4398" class="LineNr">4398 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L4399" class="LineNr">4399 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4400" class="LineNr">4400 </span>    e8/call  <a href='survey.subx.html#L4128'>num-bytes</a>/disp32
<span id="L4401" class="LineNr">4401 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4402" class="LineNr">4402 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L4403" class="LineNr">4403 </span>    <span class="subxComment"># check-ints-equal(eax, 0, msg)</span>
<span id="L4404" class="LineNr">4404 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4405" class="LineNr">4405 </span>    68/push  <span class="Constant">&quot;F - test-num-bytes-ignores-comments&quot;</span>/imm32
<span id="L4406" class="LineNr">4406 </span>    68/push  0/imm32/true
<span id="L4407" class="LineNr">4407 </span>    50/push-eax
<span id="L4408" class="LineNr">4408 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4409" class="LineNr">4409 </span>    e8/call  <a href='../051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L4410" class="LineNr">4410 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4411" class="LineNr">4411 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L4412" class="LineNr">4412 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L4413" class="LineNr">4413 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L4414" class="LineNr">4414 </span>    5d/pop-to-ebp
<span id="L4415" class="LineNr">4415 </span>    c3/return
<span id="L4416" class="LineNr">4416 </span>
<span id="L4417" class="LineNr">4417 </span><span class="subxTest">test-num-bytes-ignores-labels</span>:
<span id="L4418" class="LineNr">4418 </span>    <span class="subxComment"># if the first word ends with ':', return 0</span>
<span id="L4419" class="LineNr">4419 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L4420" class="LineNr">4420 </span>    55/push-ebp
<span id="L4421" class="LineNr">4421 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L4422" class="LineNr">4422 </span>    <span class="subxComment"># setup</span>
<span id="L4423" class="LineNr">4423 </span>    <span class="subxS1Comment"># . clear-stream(_test-input-stream)</span>
<span id="L4424" class="LineNr">4424 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4425" class="LineNr">4425 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L4426" class="LineNr">4426 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4427" class="LineNr">4427 </span>    e8/call  <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L4428" class="LineNr">4428 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4429" class="LineNr">4429 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L4430" class="LineNr">4430 </span>    <span class="subxS1Comment"># . clear-stream(_test-output-stream)</span>
<span id="L4431" class="LineNr">4431 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4432" class="LineNr">4432 </span>    68/push  <a href='../064write-byte.subx.html#L286'>_test-output-stream</a>/imm32
<span id="L4433" class="LineNr">4433 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4434" class="LineNr">4434 </span>    e8/call  <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L4435" class="LineNr">4435 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4436" class="LineNr">4436 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L4437" class="LineNr">4437 </span>    <span class="subxComment"># initialize input</span>
<span id="L4438" class="LineNr">4438 </span>    <span class="subxS1Comment"># . write(_test-input-stream, &quot;ab: # cd&quot;)</span>
<span id="L4439" class="LineNr">4439 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4440" class="LineNr">4440 </span>    68/push  <span class="Constant">&quot;ab: # cd&quot;</span>/imm32
<span id="L4441" class="LineNr">4441 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L4442" class="LineNr">4442 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4443" class="LineNr">4443 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L4444" class="LineNr">4444 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4445" class="LineNr">4445 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L4446" class="LineNr">4446 </span>    <span class="subxComment"># eax = num-bytes(_test-input-stream)</span>
<span id="L4447" class="LineNr">4447 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4448" class="LineNr">4448 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L4449" class="LineNr">4449 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4450" class="LineNr">4450 </span>    e8/call  <a href='survey.subx.html#L4128'>num-bytes</a>/disp32
<span id="L4451" class="LineNr">4451 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4452" class="LineNr">4452 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L4453" class="LineNr">4453 </span>    <span class="subxComment"># check-ints-equal(eax, 0, msg)</span>
<span id="L4454" class="LineNr">4454 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4455" class="LineNr">4455 </span>    68/push  <span class="Constant">&quot;F - test-num-bytes-ignores-labels&quot;</span>/imm32
<span id="L4456" class="LineNr">4456 </span>    68/push  0/imm32/true
<span id="L4457" class="LineNr">4457 </span>    50/push-eax
<span id="L4458" class="LineNr">4458 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4459" class="LineNr">4459 </span>    e8/call  <a href='../051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L4460" class="LineNr">4460 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4461" class="LineNr">4461 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L4462" class="LineNr">4462 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L4463" class="LineNr">4463 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L4464" class="LineNr">4464 </span>    5d/pop-to-ebp
<span id="L4465" class="LineNr">4465 </span>    c3/return
<span id="L4466" class="LineNr">4466 </span>
<span id="L4467" class="LineNr">4467 </span><span class="subxTest">test-num-bytes-ignores-segment-headers</span>:
<span id="L4468" class="LineNr">4468 </span>    <span class="subxComment"># if the first word is '==', return 0</span>
<span id="L4469" class="LineNr">4469 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L4470" class="LineNr">4470 </span>    55/push-ebp
<span id="L4471" class="LineNr">4471 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L4472" class="LineNr">4472 </span>    <span class="subxComment"># setup</span>
<span id="L4473" class="LineNr">4473 </span>    <span class="subxS1Comment"># . clear-stream(_test-input-stream)</span>
<span id="L4474" class="LineNr">4474 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4475" class="LineNr">4475 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L4476" class="LineNr">4476 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4477" class="LineNr">4477 </span>    e8/call  <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L4478" class="LineNr">4478 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4479" class="LineNr">4479 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L4480" class="LineNr">4480 </span>    <span class="subxS1Comment"># . clear-stream(_test-output-stream)</span>
<span id="L4481" class="LineNr">4481 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4482" class="LineNr">4482 </span>    68/push  <a href='../064write-byte.subx.html#L286'>_test-output-stream</a>/imm32
<span id="L4483" class="LineNr">4483 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4484" class="LineNr">4484 </span>    e8/call  <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L4485" class="LineNr">4485 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4486" class="LineNr">4486 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L4487" class="LineNr">4487 </span>    <span class="subxComment"># initialize input</span>
<span id="L4488" class="LineNr">4488 </span>    <span class="subxS1Comment"># . write(_test-input-stream, &quot;== ab cd&quot;)</span>
<span id="L4489" class="LineNr">4489 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4490" class="LineNr">4490 </span>    68/push  <span class="Constant">&quot;== ab cd&quot;</span>/imm32
<span id="L4491" class="LineNr">4491 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L4492" class="LineNr">4492 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4493" class="LineNr">4493 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L4494" class="LineNr">4494 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4495" class="LineNr">4495 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L4496" class="LineNr">4496 </span>    <span class="subxComment"># eax = num-bytes(_test-input-stream)</span>
<span id="L4497" class="LineNr">4497 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4498" class="LineNr">4498 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L4499" class="LineNr">4499 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4500" class="LineNr">4500 </span>    e8/call  <a href='survey.subx.html#L4128'>num-bytes</a>/disp32
<span id="L4501" class="LineNr">4501 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4502" class="LineNr">4502 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L4503" class="LineNr">4503 </span>    <span class="subxComment"># check-ints-equal(eax, 0, msg)</span>
<span id="L4504" class="LineNr">4504 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4505" class="LineNr">4505 </span>    68/push  <span class="Constant">&quot;F - test-num-bytes-ignores-segment-headers&quot;</span>/imm32
<span id="L4506" class="LineNr">4506 </span>    68/push  0/imm32/true
<span id="L4507" class="LineNr">4507 </span>    50/push-eax
<span id="L4508" class="LineNr">4508 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4509" class="LineNr">4509 </span>    e8/call  <a href='../051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L4510" class="LineNr">4510 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4511" class="LineNr">4511 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L4512" class="LineNr">4512 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L4513" class="LineNr">4513 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L4514" class="LineNr">4514 </span>    5d/pop-to-ebp
<span id="L4515" class="LineNr">4515 </span>    c3/return
<span id="L4516" class="LineNr">4516 </span>
<span id="L4517" class="LineNr">4517 </span><span class="subxTest">test-num-bytes-counts-words-by-default</span>:
<span id="L4518" class="LineNr">4518 </span>    <span class="subxComment"># without metadata, count words</span>
<span id="L4519" class="LineNr">4519 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L4520" class="LineNr">4520 </span>    55/push-ebp
<span id="L4521" class="LineNr">4521 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L4522" class="LineNr">4522 </span>    <span class="subxComment"># setup</span>
<span id="L4523" class="LineNr">4523 </span>    <span class="subxS1Comment"># . clear-stream(_test-input-stream)</span>
<span id="L4524" class="LineNr">4524 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4525" class="LineNr">4525 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L4526" class="LineNr">4526 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4527" class="LineNr">4527 </span>    e8/call  <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L4528" class="LineNr">4528 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4529" class="LineNr">4529 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L4530" class="LineNr">4530 </span>    <span class="subxS1Comment"># . clear-stream(_test-output-stream)</span>
<span id="L4531" class="LineNr">4531 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4532" class="LineNr">4532 </span>    68/push  <a href='../064write-byte.subx.html#L286'>_test-output-stream</a>/imm32
<span id="L4533" class="LineNr">4533 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4534" class="LineNr">4534 </span>    e8/call  <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L4535" class="LineNr">4535 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4536" class="LineNr">4536 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L4537" class="LineNr">4537 </span>    <span class="subxComment"># initialize input</span>
<span id="L4538" class="LineNr">4538 </span>    <span class="subxS1Comment"># . write(_test-input-stream, &quot;ab cd ef&quot;)</span>
<span id="L4539" class="LineNr">4539 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4540" class="LineNr">4540 </span>    68/push  <span class="Constant">&quot;ab cd ef&quot;</span>/imm32
<span id="L4541" class="LineNr">4541 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L4542" class="LineNr">4542 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4543" class="LineNr">4543 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L4544" class="LineNr">4544 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4545" class="LineNr">4545 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L4546" class="LineNr">4546 </span>    <span class="subxComment"># eax = num-bytes(_test-input-stream)</span>
<span id="L4547" class="LineNr">4547 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4548" class="LineNr">4548 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L4549" class="LineNr">4549 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4550" class="LineNr">4550 </span>    e8/call  <a href='survey.subx.html#L4128'>num-bytes</a>/disp32
<span id="L4551" class="LineNr">4551 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4552" class="LineNr">4552 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L4553" class="LineNr">4553 </span>    <span class="subxComment"># check-ints-equal(eax, 3, msg)</span>
<span id="L4554" class="LineNr">4554 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4555" class="LineNr">4555 </span>    68/push  <span class="Constant">&quot;F - test-num-bytes-counts-words-by-default&quot;</span>/imm32
<span id="L4556" class="LineNr">4556 </span>    68/push  3/imm32/true
<span id="L4557" class="LineNr">4557 </span>    50/push-eax
<span id="L4558" class="LineNr">4558 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4559" class="LineNr">4559 </span>    e8/call  <a href='../051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L4560" class="LineNr">4560 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4561" class="LineNr">4561 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L4562" class="LineNr">4562 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L4563" class="LineNr">4563 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L4564" class="LineNr">4564 </span>    5d/pop-to-ebp
<span id="L4565" class="LineNr">4565 </span>    c3/return
<span id="L4566" class="LineNr">4566 </span>
<span id="L4567" class="LineNr">4567 </span><span class="subxTest">test-num-bytes-ignores-trailing-comment</span>:
<span id="L4568" class="LineNr">4568 </span>    <span class="subxComment"># trailing comments appropriately ignored</span>
<span id="L4569" class="LineNr">4569 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L4570" class="LineNr">4570 </span>    55/push-ebp
<span id="L4571" class="LineNr">4571 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L4572" class="LineNr">4572 </span>    <span class="subxComment"># setup</span>
<span id="L4573" class="LineNr">4573 </span>    <span class="subxS1Comment"># . clear-stream(_test-input-stream)</span>
<span id="L4574" class="LineNr">4574 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4575" class="LineNr">4575 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L4576" class="LineNr">4576 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4577" class="LineNr">4577 </span>    e8/call  <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L4578" class="LineNr">4578 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4579" class="LineNr">4579 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L4580" class="LineNr">4580 </span>    <span class="subxS1Comment"># . clear-stream(_test-output-stream)</span>
<span id="L4581" class="LineNr">4581 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4582" class="LineNr">4582 </span>    68/push  <a href='../064write-byte.subx.html#L286'>_test-output-stream</a>/imm32
<span id="L4583" class="LineNr">4583 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4584" class="LineNr">4584 </span>    e8/call  <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L4585" class="LineNr">4585 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4586" class="LineNr">4586 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L4587" class="LineNr">4587 </span>    <span class="subxComment"># initialize input</span>
<span id="L4588" class="LineNr">4588 </span>    <span class="subxS1Comment"># . write(_test-input-stream, &quot;ab cd # ef&quot;)</span>
<span id="L4589" class="LineNr">4589 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4590" class="LineNr">4590 </span>    68/push  <span class="Constant">&quot;ab cd # ef&quot;</span>/imm32
<span id="L4591" class="LineNr">4591 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L4592" class="LineNr">4592 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4593" class="LineNr">4593 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L4594" class="LineNr">4594 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4595" class="LineNr">4595 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L4596" class="LineNr">4596 </span>    <span class="subxComment"># eax = num-bytes(_test-input-stream)</span>
<span id="L4597" class="LineNr">4597 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4598" class="LineNr">4598 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L4599" class="LineNr">4599 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4600" class="LineNr">4600 </span>    e8/call  <a href='survey.subx.html#L4128'>num-bytes</a>/disp32
<span id="L4601" class="LineNr">4601 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4602" class="LineNr">4602 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L4603" class="LineNr">4603 </span>    <span class="subxComment"># check-ints-equal(eax, 2, msg)</span>
<span id="L4604" class="LineNr">4604 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4605" class="LineNr">4605 </span>    68/push  <span class="Constant">&quot;F - test-num-bytes-ignores-trailing-comment&quot;</span>/imm32
<span id="L4606" class="LineNr">4606 </span>    68/push  2/imm32/true
<span id="L4607" class="LineNr">4607 </span>    50/push-eax
<span id="L4608" class="LineNr">4608 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4609" class="LineNr">4609 </span>    e8/call  <a href='../051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L4610" class="LineNr">4610 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4611" class="LineNr">4611 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L4612" class="LineNr">4612 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L4613" class="LineNr">4613 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L4614" class="LineNr">4614 </span>    5d/pop-to-ebp
<span id="L4615" class="LineNr">4615 </span>    c3/return
<span id="L4616" class="LineNr">4616 </span>
<span id="L4617" class="LineNr">4617 </span><span class="subxTest">test-num-bytes-handles-imm32</span>:
<span id="L4618" class="LineNr">4618 </span>    <span class="subxComment"># if a word has the /imm32 metadata, count it as 4 bytes</span>
<span id="L4619" class="LineNr">4619 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L4620" class="LineNr">4620 </span>    55/push-ebp
<span id="L4621" class="LineNr">4621 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L4622" class="LineNr">4622 </span>    <span class="subxComment"># setup</span>
<span id="L4623" class="LineNr">4623 </span>    <span class="subxS1Comment"># . clear-stream(_test-input-stream)</span>
<span id="L4624" class="LineNr">4624 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4625" class="LineNr">4625 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L4626" class="LineNr">4626 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4627" class="LineNr">4627 </span>    e8/call  <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L4628" class="LineNr">4628 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4629" class="LineNr">4629 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L4630" class="LineNr">4630 </span>    <span class="subxS1Comment"># . clear-stream(_test-output-stream)</span>
<span id="L4631" class="LineNr">4631 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4632" class="LineNr">4632 </span>    68/push  <a href='../064write-byte.subx.html#L286'>_test-output-stream</a>/imm32
<span id="L4633" class="LineNr">4633 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4634" class="LineNr">4634 </span>    e8/call  <a href='../055stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L4635" class="LineNr">4635 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4636" class="LineNr">4636 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L4637" class="LineNr">4637 </span>    <span class="subxComment"># initialize input</span>
<span id="L4638" class="LineNr">4638 </span>    <span class="subxS1Comment"># . write(_test-input-stream, &quot;ab cd/imm32 ef&quot;)</span>
<span id="L4639" class="LineNr">4639 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4640" class="LineNr">4640 </span>    68/push  <span class="Constant">&quot;ab cd/imm32 ef&quot;</span>/imm32
<span id="L4641" class="LineNr">4641 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L4642" class="LineNr">4642 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4643" class="LineNr">4643 </span>    e8/call  <a href='../057write.subx.html#L24'>write</a>/disp32
<span id="L4644" class="LineNr">4644 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4645" class="LineNr">4645 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L4646" class="LineNr">4646 </span>    <span class="subxComment"># eax = num-bytes(_test-input-stream)</span>
<span id="L4647" class="LineNr">4647 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4648" class="LineNr">4648 </span>    68/push  <a href='../061read-byte.subx.html#L287'>_test-input-stream</a>/imm32
<span id="L4649" class="LineNr">4649 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4650" class="LineNr">4650 </span>    e8/call  <a href='survey.subx.html#L4128'>num-bytes</a>/disp32
<span id="L4651" class="LineNr">4651 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4652" class="LineNr">4652 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L4653" class="LineNr">4653 </span>    <span class="subxComment"># check-ints-equal(eax, 6, msg)</span>
<span id="L4654" class="LineNr">4654 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L4655" class="LineNr">4655 </span>    68/push  <span class="Constant">&quot;F - test-num-bytes-handles-imm32&quot;</span>/imm32
<span id="L4656" class="LineNr">4656 </span>    68/push  6/imm32/true
<span id="L4657" class="LineNr">4657 </span>    50/push-eax
<span id="L4658" class="LineNr">4658 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L4659" class="LineNr">4659 </span>    e8/call  <a href='../051test.subx.html#L24'>check-ints-equal</a>/disp32
<span id="L4660" class="LineNr">4660 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L4661" class="LineNr">4661 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L4662" class="LineNr">4662 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L4663" class="LineNr">4663 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L4664" class="LineNr">4664 </span>    5d/pop-to-ebp
<span id="L4665" class="LineNr">4665 </span>    c3/return
<span id="L4666" class="LineNr">4666 </span>
<span id="L4667" class="LineNr">4667 </span>== data
<span id="L4668" class="LineNr">4668 </span>
<span id="L4669" class="LineNr">4669 </span><span class="subxComment"># This block of bytes gets copied to the start of the output ELF file, with</span>
<span id="L4670" class="LineNr">4670 </span><span class="subxComment"># some fields (the ones with labels capitalized) filled in.</span>
<span id="L4671" class="LineNr">4671 </span><span class="subxComment"># <a href="http://www.sco.com/developers/gabi/latest/ch4.eheader.html">http://www.sco.com/developers/gabi/latest/ch4.eheader.html</a></span>
<span id="L4672" class="LineNr">4672 </span><span class="SpecialChar">Elf_header</span>:
<span id="L4673" class="LineNr">4673 </span>  <span class="subxH1Comment"># - length</span>
<span id="L4674" class="LineNr">4674 </span>  0x34/imm32
<span id="L4675" class="LineNr">4675 </span>  <span class="subxH1Comment"># - data</span>
<span id="L4676" class="LineNr">4676 </span><span class="Constant">$e_ident</span>:
<span id="L4677" class="LineNr">4677 </span>  7f 45/E 4c/L 46/F
<span id="L4678" class="LineNr">4678 </span>  01/32-bit  01/little-endian  01/file-version  00/no-os-extensions
<span id="L4679" class="LineNr">4679 </span>  00 00 00 00 00 00 00 00  <span class="subxComment"># 8 bytes of padding</span>
<span id="L4680" class="LineNr">4680 </span><span class="Constant">$e_type</span>:
<span id="L4681" class="LineNr">4681 </span>  02 00
<span id="L4682" class="LineNr">4682 </span><span class="Constant">$e_machine</span>:
<span id="L4683" class="LineNr">4683 </span>  03 00
<span id="L4684" class="LineNr">4684 </span><span class="Constant">$e_version</span>:
<span id="L4685" class="LineNr">4685 </span>  1/imm32
<span id="L4686" class="LineNr">4686 </span><span class="Constant">$Elf_e_entry</span>:
<span id="L4687" class="LineNr">4687 </span>  0x09000000/imm32  <span class="subxComment"># approximate default; must be updated</span>
<span id="L4688" class="LineNr">4688 </span><span class="Constant">$e_phoff</span>:
<span id="L4689" class="LineNr">4689 </span>  0x34/imm32  <span class="subxComment"># offset for the 'program header table' containing segment headers</span>
<span id="L4690" class="LineNr">4690 </span><span class="Constant">$e_shoff</span>:
<span id="L4691" class="LineNr">4691 </span>  0/imm32  <span class="subxComment"># no sections</span>
<span id="L4692" class="LineNr">4692 </span><span class="Constant">$e_flags</span>:
<span id="L4693" class="LineNr">4693 </span>  0/imm32  <span class="subxComment"># unused</span>
<span id="L4694" class="LineNr">4694 </span><span class="Constant">$e_ehsize</span>:
<span id="L4695" class="LineNr">4695 </span>  0x34 00
<span id="L4696" class="LineNr">4696 </span><span class="Constant">$e_phentsize</span>:
<span id="L4697" class="LineNr">4697 </span>  0x20 00
<span id="L4698" class="LineNr">4698 </span><span class="Constant">$Elf_e_phnum</span>:
<span id="L4699" class="LineNr">4699 </span>  00 00  <span class="subxComment"># number of segments; must be updated</span>
<span id="L4700" class="LineNr">4700 </span><span class="Constant">$e_shentsize</span>:
<span id="L4701" class="LineNr">4701 </span>  00 00  <span class="subxComment"># no sections</span>
<span id="L4702" class="LineNr">4702 </span><span class="Constant">$e_shnum</span>:
<span id="L4703" class="LineNr">4703 </span>  00 00
<span id="L4704" class="LineNr">4704 </span><span class="Constant">$e_shstrndx</span>:
<span id="L4705" class="LineNr">4705 </span>  00 00
<span id="L4706" class="LineNr">4706 </span>
<span id="L4707" class="LineNr">4707 </span><span class="subxComment"># This block of bytes gets copied after the Elf_header once for each segment.</span>
<span id="L4708" class="LineNr">4708 </span><span class="subxComment"># Some fields need filling in each time.</span>
<span id="L4709" class="LineNr">4709 </span><span class="subxComment"># <a href="https://docs.oracle.com/cd/E19683-01/816-1386/chapter6-83432/index.html">https://docs.oracle.com/cd/E19683-01/816-1386/chapter6-83432/index.html</a></span>
<span id="L4710" class="LineNr">4710 </span><span class="SpecialChar">Elf_program_header_entry</span>:
<span id="L4711" class="LineNr">4711 </span>  <span class="subxH1Comment"># - length</span>
<span id="L4712" class="LineNr">4712 </span>  0x20/imm32
<span id="L4713" class="LineNr">4713 </span>  <span class="subxH1Comment"># - data</span>
<span id="L4714" class="LineNr">4714 </span><span class="Constant">$p_type</span>:
<span id="L4715" class="LineNr">4715 </span>  1/imm32/PT_LOAD
<span id="L4716" class="LineNr">4716 </span><span class="Constant">$Elf_p_offset</span>:
<span id="L4717" class="LineNr">4717 </span>  0/imm32  <span class="subxComment"># byte offset in the file at which a segment begins; must be updated</span>
<span id="L4718" class="LineNr">4718 </span><span class="Constant">$Elf_p_vaddr</span>:
<span id="L4719" class="LineNr">4719 </span>  0/imm32  <span class="subxComment"># starting address to store the segment at before running the program</span>
<span id="L4720" class="LineNr">4720 </span><span class="Constant">$Elf_p_paddr</span>:
<span id="L4721" class="LineNr">4721 </span>  0/imm32  <span class="subxComment"># should have same value as $Elf_p_vaddr</span>
<span id="L4722" class="LineNr">4722 </span><span class="Constant">$Elf_p_filesz</span>:
<span id="L4723" class="LineNr">4723 </span>  0/imm32
<span id="L4724" class="LineNr">4724 </span><span class="Constant">$Elf_p_memsz</span>:
<span id="L4725" class="LineNr">4725 </span>  0/imm32  <span class="subxComment"># should have same value as $Elf_p_filesz</span>
<span id="L4726" class="LineNr">4726 </span><span class="Constant">$Elf_p_flags</span>:
<span id="L4727" class="LineNr">4727 </span>  6/imm32/rw-  <span class="subxComment"># read/write/execute permissions for the segment; must be updated for the code segment</span>
<span id="L4728" class="LineNr">4728 </span><span class="Constant">$p_align</span>:
<span id="L4729" class="LineNr">4729 </span>  <span class="subxComment"># we hold this constant; changing it will require adjusting the way we</span>
<span id="L4730" class="LineNr">4730 </span>  <span class="subxComment"># compute the starting address for each segment</span>
<span id="L4731" class="LineNr">4731 </span>  0x1000/imm32
<span id="L4732" class="LineNr">4732 </span>
<span id="L4733" class="LineNr">4733 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
</pre>
</body>
</html>
<!-- vim: set foldmethod=manual : -->