Skip to content

Instantly share code, notes, and snippets.

@badamczewski
Created January 26, 2022 10:43
Show Gist options
  • Select an option

  • Save badamczewski/7aeb58b67b600241431c73d2f7fd8d9b to your computer and use it in GitHub Desktop.

Select an option

Save badamczewski/7aeb58b67b600241431c73d2f7fd8d9b to your computer and use it in GitHub Desktop.

Revisions

  1. badamczewski created this gist Jan 26, 2022.
    122 changes: 122 additions & 0 deletions nullable.asm
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,122 @@

    public int? A(int? x, int? y) {
    int? sum = 0;
    for(int i = 0; i < 1000; i++)
    sum += x + y;
    return sum.Value;
    }

    public int? B(int? x, int? y) {
    int? sum = 0;
    var h = x + y;
    for(int i = 0; i < 1000; i++)
    sum += h;
    return sum.Value;
    }

    # C# 9.0 .NET: 6.0.0
    # Instruction Count: 49; Code Size: 148
    Nullable`1 A(Nullable`1, Nullable`1):
    0440: sub rsp, 28h # stack.push_times(5)
    0444: mov [rsp+38h], rdx # Memory[rsp+38h] = rdx
    0449: mov [rsp+40h], r8 # Memory[rsp+40h] = r8
    # int? sum = 0;
    044E: xor eax, eax # eax = 0
    0450: mov edx, 1 # edx = 1
    # for(int i = 0; i < 1000; i++)
    0455: xor ecx, ecx # ecx = 0
    # sum += x + y;
    ┌──────────>0457: movzx r8d, byte ptr [rsp+38h]
    │ 045D: mov r9d, [rsp+3Ch] # r9d = Memory[rsp+3Ch]
    0462: movzx r10d, byte ptr [rsp+40h]
    0468: mov r11d, [rsp+44h] # r11d = Memory[rsp+44h]
    │ 046D: movzx r8d, r8b
    0471: movzx r10d, r10b
    0475: test r10d, r8d # if(r10d & r8d != 0)
    │ ┌────◦0478: jne short 0482 ⇣ # goto 7FFBBA970482
    │ │ 047A: xor r8d, r8d # r8d = 0
    │ │ 047D: xor r10d, r10d # r10d = 0
    │ │ ┌──◦0480: jmp short 048E ⇣ # goto 7FFBBA97048E
    │ └─┼──>0482: add r9d, r11d # r9d += r11d
    │ │ 0485: mov r10d, r9d # r10d = r9d
    │ │ 0488: mov r8d, 1 # r8d = 1
    │ └──>048E: movzx edx, dl
    0491: movzx r8d, r8b
    0495: test r8d, edx # if(r8d & edx != 0)
    │ ┌──────◦0498: jne short 04A5 ⇣ # goto 7FFBBA9704A5
    │ │ 049A: xor r10d, r10d # r10d = 0
    │ │ 049D: movzx edx, r10b
    │ │ 04A1: xor eax, eax # eax = 0
    │ │ ┌◦04A3: jmp short 04AD ⇣ # goto 7FFBBA9704AD
    │ └─────┼>04A5: add eax, r10d # eax += r10d
    │ │ 04A8: mov edx, 1 # edx = 1
    │ │ # for(int i = 0; i < 1000; i++)
    │ └>04AD: inc ecx # ecx++
    │ # for(int i = 0; i < 1000; i++)
    │ 04AF: cmp ecx, 3E8h # if(ecx < 1000)
    └──────────◦04B5: jl short 0457 ⇡ # └> goto 7FFBBA970457
    # return sum.Value;
    04B7: test dl, dl # if(dl & dl == 0)
    ┌────────◦04B9: je short 04CE ⇣ # goto 7FFBBA9704CE
    │ 04BB: mov [rsp+24h], eax # Memory[rsp+24h] = eax
    │ 04BF: mov byte ptr [rsp+20h], 1 # byte ptr [rsp+20h] = 1
    │ 04C4: mov rax, [rsp+20h] # rax = Memory[rsp+20h]
    │ 04C9: add rsp, 28h # stack.pop_times(5)
    │ 04CD: ret # return;
    │ # return sum.Value;
    └────────>04CE: call System.ThrowHelper.ThrowInvalidOperationException_InvalidOperation_NoValue() 44F8 ↷
    04D3: int 3
    # Instruction Count: 51; Code Size: 147
    Nullable`1 B(Nullable`1, Nullable`1):
    0500: sub rsp, 28h # stack.push_times(5)
    0504: mov [rsp+38h], rdx # Memory[rsp+38h] = rdx
    0509: mov [rsp+40h], r8 # Memory[rsp+40h] = r8
    # int? sum = 0;
    050E: xor eax, eax # eax = 0
    0510: mov edx, 1 # edx = 1
    # var h = x + y;
    0515: movzx ecx, byte ptr [rsp+38h]
    051A: mov r8d, [rsp+3Ch] # r8d = Memory[rsp+3Ch]
    051F: movzx r9d, byte ptr [rsp+40h]
    0525: mov r10d, [rsp+44h] # r10d = Memory[rsp+44h]
    052A: movzx ecx, cl
    052D: movzx r9d, r9b
    0531: test r9d, ecx # if(r9d & ecx != 0)
    ┌──◦0534: jne short 053D ⇣ # goto 7FFBBA97053D
    0536: xor ecx, ecx # ecx = 0
    0538: xor r9d, r9d # r9d = 0
    ┌───┼──◦053B: jmp short 0546 ⇣ # goto 7FFBBA970546
    │ └──>053D: add r8d, r10d # r8d += r10d
    0540: mov r9d, r8d # r9d = r8d
    0543: movzx ecx, dl
    │ # for(int i = 0; i < 1000; i++)
    └──────>0546: xor r8d, r8d # r8d = 0
    0549: movzx ecx, cl
    # sum += h;
    ┌──────────>054C: mov r10d, eax # r10d = eax
    │ 054F: movzx edx, dl
    0552: test ecx, edx # if(ecx & edx != 0)
    │ ┌────◦0554: jne short 0561 ⇣ # goto 7FFBBA970561
    │ │ 0556: xor r10d, r10d # r10d = 0
    │ │ 0559: movzx edx, r10b
    │ │ 055D: xor eax, eax # eax = 0
    │ │ ┌◦055F: jmp short 056A ⇣ # goto 7FFBBA97056A
    │ └───┼>0561: lea eax, [r10+r9] # eax = r10+r9
    │ │ 0565: mov edx, 1 # edx = 1
    │ │ # for(int i = 0; i < 1000; i++)
    │ └>056A: inc r8d # r8d++
    │ # for(int i = 0; i < 1000; i++)
    │ 056D: cmp r8d, 3E8h # if(r8d < 1000)
    └──────────◦0574: jl short 054C ⇡ # └> goto 7FFBBA97054C
    # return sum.Value;
    0576: test dl, dl # if(dl & dl == 0)
    ┌────────◦0578: je short 058D ⇣ # goto 7FFBBA97058D
    │ 057A: mov [rsp+24h], eax # Memory[rsp+24h] = eax
    │ 057E: mov byte ptr [rsp+20h], 1 # byte ptr [rsp+20h] = 1
    0583: mov rax, [rsp+20h] # rax = Memory[rsp+20h]
    0588: add rsp, 28h # stack.pop_times(5)
    │ 058C: ret # return;
    │ # return sum.Value;
    └────────>058D: call System.ThrowHelper.ThrowInvalidOperationException_InvalidOperation_NoValue() 44F8 ↷
    0592: int 3