diff --git a/examples/README.md b/examples/README.md index 37085cd..aeb6a36 100644 --- a/examples/README.md +++ b/examples/README.md @@ -10,3 +10,4 @@ Features: * **[args](args):** Loading function arguments. * **[returns](returns):** Building return values. * **[complex](complex):** Working with `complex{64,128}` types. +* **[data](data):** Defining `DATA` sections. diff --git a/examples/data/README.md b/examples/data/README.md new file mode 100644 index 0000000..72fe649 --- /dev/null +++ b/examples/data/README.md @@ -0,0 +1,33 @@ +# data + +Constructing data sections in `avo`. + +A data section is declared with the `GLOBL` function, and values are specified with `DATA`. The size of the data section will grow as values are added to it. + +[embedmd]:# (asm.go go /.*GLOBL\(/ /^$/) +```go + bytes := GLOBL("bytes", RODATA|NOPTR) + DATA(0, U64(0x0011223344556677)) + DATA(8, String("strconst")) + DATA(16, F32(math.Pi)) + DATA(24, F64(math.Pi)) + DATA(32, U32(0x00112233)) + DATA(36, U16(0x4455)) + DATA(38, U8(0x66)) + DATA(39, U8(0x77)) +``` + +The `GLOBL` function returns a reference which may be used in assembly code. The following function indexes into the data section just created. + +[embedmd]:# (asm.go go /.*TEXT.*DataAt/ /RET.*/) +```go + TEXT("DataAt", "func(i int) byte") + Doc("DataAt returns byte i in the 'bytes' global data section.") + i := Load(Param("i"), GP64v()) + ptr := Mem{Base: GP64v()} + LEAQ(bytes, ptr.Base) + b := GP8v() + MOVB(ptr.Idx(i, 1), b) + Store(b, ReturnIndex(0)) + RET() +``` diff --git a/examples/data/asm.go b/examples/data/asm.go index 58e4ebe..31e35f4 100644 --- a/examples/data/asm.go +++ b/examples/data/asm.go @@ -5,13 +5,13 @@ package main import ( "math" - "github.com/mmcloughlin/avo" + . "github.com/mmcloughlin/avo" . "github.com/mmcloughlin/avo/build" . "github.com/mmcloughlin/avo/operand" ) func main() { - bytes := GLOBL("bytes", avo.RODATA|avo.NOPTR) + bytes := GLOBL("bytes", RODATA|NOPTR) DATA(0, U64(0x0011223344556677)) DATA(8, String("strconst")) DATA(16, F32(math.Pi))