## Overview
I want to understand what some of the basic datatypes in Odin look like.
## How to Run Experiments That Reveal the Structures
I write little test programs, then run them in a debugger and disassemble them.
I show how to edit/compile/debug/disassemble small bits of Odin code in this short video https://youtu.be/pBbFuSwaIFY.
In the video, I also discuss how to avoid compiler optimizations and how to avoid too much detail at first.
## Data Shapes
### int
![[DrawIO/odin data shapes-int.drawio.png]]
### slice
![[DrawIO/odin data shapes-slice.drawio.png]]
### string
![[DrawIO/odin data shapes-string.drawio.png]]
### any
![[DrawIO/odin data shapes-any.drawio.png]]
```
any :: struct {
data: rawptr,
id: typeid,
}
```
## Appendix - Experiments
### Code (Odin)
```
package odinasm
pt0 :: proc (x, y : int) -> int {
return x + y
}
pt1 :: proc (x : int) -> int {
return x
}
pt2 :: proc (x : any) -> any {
return x
}
pt3 :: proc (x : []int) -> []int {
return x
}
pt4 :: proc (s : string) -> int {
return len (s)
}
pt5 :: proc (s : string) -> string {
return s
}
main :: proc () {
z0 : int = pt0 (65, 66)
z1 : int = pt1 (65)
z2 : any = pt2 (65)
z3 : []int = pt3 ([]int{65,66,67})
z4 := pt4 ("abcdefghijklmn ABCDEFGHIJKLMN")
z5 := pt5 ("abcdefghijklmn ABCDEFGHIJKLMN")
}
```
N.B. There is currently no experiment regarding the *any* type. Understanding of *any* came about through conversations with Zac Nowicki.
### Disassembly
#### pt0
```
odinasm.bin`odinasm.pt0:
0x100006cb0 <+0>: movq %rdi, -0x8(%rsp)
0x100006cb5 <+5>: movq %rsi, -0x10(%rsp)
-> 0x100006cba <+10>: jmp 0x100006cbc ; <+12> at main.odin
0x100006cbc <+12>: movq -0x8(%rsp), %rax
0x100006cc1 <+17>: movq -0x10(%rsp), %rcx
0x100006cc6 <+22>: addq %rcx, %rax
0x100006cc9 <+25>: retq
```
#### pt1
```
odinasm.bin`odinasm.pt1:
0x100006e80 <+0>: movq %rdi, -0x8(%rsp)
-> 0x100006e85 <+5>: jmp 0x100006e87 ; <+7> at main.odin
0x100006e87 <+7>: movq -0x8(%rsp), %rax
0x100006e8c <+12>: retq
```
#### pt2
```
odinasm.bin`odinasm.pt2:
0x100006e90 <+0>: movq %rsi, -0x8(%rsp)
0x100006e95 <+5>: movq %rdi, -0x10(%rsp)
-> 0x100006e9a <+10>: jmp 0x100006e9c ; <+12> at main.odin
0x100006e9c <+12>: movq -0x10(%rsp), %rax
0x100006ea1 <+17>: movq -0x8(%rsp), %rdx
0x100006ea6 <+22>: retq
```
#### pt3
```
odinasm.bin`odinasm.pt3:
0x100007010 <+0>: movq %rsi, -0x8(%rsp)
0x100007015 <+5>: movq %rdi, -0x10(%rsp)
-> 0x10000701a <+10>: jmp 0x10000701c ; <+12> at main.odin
0x10000701c <+12>: movq -0x10(%rsp), %rax
0x100007021 <+17>: movq -0x8(%rsp), %rdx
0x100007026 <+22>: retq
```
#### pt4
```
odinasm.bin`odinasm.pt4:
0x100007030 <+0>: movq %rsi, -0x8(%rsp)
-> 0x100007035 <+5>: jmp 0x100007037 ; <+7> at main.odin
0x100007037 <+7>: movq -0x8(%rsp), %rax
0x10000703c <+12>: retq
```
#### pt5
```
odinasm.bin`odinasm.pt5:
0x100007040 <+0>: movq %rsi, -0x8(%rsp)
0x100007045 <+5>: movq %rdi, -0x10(%rsp)
-> 0x10000704a <+10>: jmp 0x10000704c ; <+12> at main.odin
0x10000704c <+12>: movq -0x10(%rsp), %rax
0x100007051 <+17>: movq -0x8(%rsp), %rdx
0x100007056 <+22>: retq
```
---
#### pt9
```
pt9 :: proc (s : string) {
pt7 (raw_data (s))
}
```
```
odinasm`odinasm.pt9:
0x1000041c0 <+0>: subq $0x28, %rsp
0x1000041c4 <+4>: movq %rdx, 0x10(%rsp)
0x1000041c9 <+9>: movq %rsi, 0x8(%rsp)
0x1000041ce <+14>: movq %rdi, (%rsp)
0x1000041d2 <+18>: movq (%rsp), %rax
0x1000041d6 <+22>: movq %rax, 0x18(%rsp)
0x1000041db <+27>: movq 0x8(%rsp), %rcx
0x1000041e0 <+32>: movq %rcx, 0x20(%rsp)
0x1000041e5 <+37>: movq 0x10(%rsp), %rdx
-> 0x1000041ea <+42>: movq %rax, %rdi
0x1000041ed <+45>: movq %rdx, %rsi
0x1000041f0 <+48>: callq 0x1000040d0 ; odinasm.pt7 at main.odin:35
0x1000041f5 <+53>: addq $0x28, %rsp
0x1000041f9 <+57>: retq
```
0x28 = 40 decimal
```
odinasm`odinasm.pt9:
0x1000041c0 <+0>: subq $0x28, %rsp
```
```
0x1000041c4 <+4>: movq %rdx, 0x10(%rsp)
0x1000041c9 <+9>: movq %rsi, 0x8(%rsp)
0x1000041ce <+14>: movq %rdi, (%rsp)
```
```
0x1000041d2 <+18>: movq (%rsp), %rax
0x1000041d6 <+22>: movq %rax, 0x18(%rsp)
0x1000041db <+27>: movq 0x8(%rsp), %rcx
0x1000041e0 <+32>: movq %rcx, 0x20(%rsp)
```
```
0x1000041e5 <+37>: movq 0x10(%rsp), %rdx
-> 0x1000041ea <+42>: movq %rax, %rdi
0x1000041ed <+45>: movq %rdx, %rsi
```
```
0x1000041f0 <+48>: callq 0x1000040d0 ; odinasm.pt7 at main.odin:35
```
```
0x1000041f5 <+53>: addq $0x28, %rsp
0x1000041f9 <+57>: retq
```