mirror of
https://github.com/pkivolowitz/asm_book.git
synced 2026-06-23 03:26:48 +08:00
added description of const variables
This commit is contained in:
parent
c76f9cf931
commit
b0e7f86154
5 changed files with 970 additions and 1 deletions
|
|
@ -61,7 +61,8 @@ the 64 bit ARM Instruction Set Architecture (ISA).
|
||||||
| .... a | [.... Alignment](./section_1/structs/alignment.md) |
|
| .... a | [.... Alignment](./section_1/structs/alignment.md) |
|
||||||
| .... b | [.... Defining](./section_1/structs/defining.md) |
|
| .... b | [.... Defining](./section_1/structs/defining.md) |
|
||||||
| .... c | [.... Using](./section_1/structs/using.md) |
|
| .... c | [.... Using](./section_1/structs/using.md) |
|
||||||
| 8 | [Casting](./section_1/casting/README.md) |
|
| 8 | [`const`](./section1/const/README.md)
|
||||||
|
| 9 | [Casting](./section_1/casting/README.md) |
|
||||||
|
|
||||||
## Section 2 - Stuff
|
## Section 2 - Stuff
|
||||||
|
|
||||||
|
|
|
||||||
117
section_1/const/README.md
Normal file
117
section_1/const/README.md
Normal file
|
|
@ -0,0 +1,117 @@
|
||||||
|
# Section 1 / `const`
|
||||||
|
|
||||||
|
In C++, a variable declared to be const cannot be altered.
|
||||||
|
This concept only *partially* translates to assembly language
|
||||||
|
in a manner which is enforced by the hardware. The remainder
|
||||||
|
of the functionality of `const` is enforced at compile time
|
||||||
|
and therefore, at the assembly language level, all bets are
|
||||||
|
off.
|
||||||
|
|
||||||
|
## What Is **Not** Enforced
|
||||||
|
|
||||||
|
Given [this](./const_test.cpp) short C++ snippet:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
#include <stdio.h> // 1
|
||||||
|
// 2
|
||||||
|
void Const1() { // 3
|
||||||
|
const int foo = 9; // 4
|
||||||
|
printf("%d\n", foo); // 5
|
||||||
|
} // 6
|
||||||
|
```
|
||||||
|
|
||||||
|
it is the C++ compiler that enforces the immutable nature of `foo`.
|
||||||
|
Looking at the assembly language that is produced from this C++ code,
|
||||||
|
you will [see](./const_test.s) that `foo` is implemented like any other
|
||||||
|
variable. Once
|
||||||
|
in assembly language you are behind the defenses of the compiler so
|
||||||
|
to speak. You can modify a `const` local variable or parameter to your
|
||||||
|
heart's content. Should you? That's another question. Will it cause harm?
|
||||||
|
It depends.
|
||||||
|
|
||||||
|
## What **IS** Enforced
|
||||||
|
|
||||||
|
Let's examine [this](./rodata.s) code:
|
||||||
|
|
||||||
|
```text
|
||||||
|
.global main // 1
|
||||||
|
.align 2 // 2
|
||||||
|
// 3
|
||||||
|
.section .rodata // 4
|
||||||
|
rotypo: .asciz "Rypo" // Meant this to be "Typo" // 5
|
||||||
|
fmt: .asciz "%s\n" // Used to print the strings // 6
|
||||||
|
// 7
|
||||||
|
.data // 8
|
||||||
|
rwtypo: .asciz "Rypo" // Meant this to be "Typo" // 9
|
||||||
|
// 10
|
||||||
|
.text // 11
|
||||||
|
// 12
|
||||||
|
main: str x30, [sp, -16]! // 13
|
||||||
|
// Try to fix rwtypo --- this will work // 14
|
||||||
|
ldr x1, =rwtypo // 15
|
||||||
|
mov w2, 'T' // 16
|
||||||
|
strb w2, [x1] // 17
|
||||||
|
ldr x0, =fmt // Notice I already loaded rwtypo // 18
|
||||||
|
bl printf // 19
|
||||||
|
// 20
|
||||||
|
// Try to fix rotypo --- this will end in tears // 21
|
||||||
|
ldr x1, =rotypo // 22
|
||||||
|
mov w2, 'T' // 23
|
||||||
|
strb w2, [x1] // 24
|
||||||
|
ldr x0, =fmt // Notice I already loaded rotypo // 25
|
||||||
|
bl printf // 26
|
||||||
|
// 27
|
||||||
|
ldr x30, [sp], 16 // 28
|
||||||
|
mov w0, wzr // 29
|
||||||
|
ret // 30
|
||||||
|
// 31
|
||||||
|
.end // 32
|
||||||
|
// 33
|
||||||
|
```
|
||||||
|
|
||||||
|
In this example, we are declaring a `const` *global variable*.
|
||||||
|
|
||||||
|
Notice `.section .rodata`. This assembler directive tells the linker to place
|
||||||
|
what follows into memory that will be marked as read only. Any attempt to
|
||||||
|
modify something marked as read only by the hardware will result in a crash.
|
||||||
|
|
||||||
|
`rwtypo` can be read and written as it is located after a `.data`. The
|
||||||
|
string contains a typo - we meant to write "Typo" but we experienced a
|
||||||
|
senior moment and what got entered was "Rypo". Could happen to anyone.
|
||||||
|
|
||||||
|
For some reason, we will fix "Rypo", turning it into "Type" using code
|
||||||
|
rather than simply editing the file.
|
||||||
|
|
||||||
|
The same is true for `rotypo`. Extra credit for being consistent.
|
||||||
|
|
||||||
|
However,
|
||||||
|
`rotypo` is going to live in a region of memory marked as read only
|
||||||
|
at the hardware level because it is defined after a `.section .rodata`.
|
||||||
|
|
||||||
|
Will we be able to correct it using code?
|
||||||
|
|
||||||
|
tl;dr Nope.
|
||||||
|
|
||||||
|
This program, when run, will produce the following output:
|
||||||
|
|
||||||
|
```text
|
||||||
|
const > ./a.out
|
||||||
|
Typo
|
||||||
|
Segmentation fault (core dumped)
|
||||||
|
const >
|
||||||
|
```
|
||||||
|
|
||||||
|
This demonstrates that the first attempt at modifying `rwtypo` worked. And
|
||||||
|
then, an attempt to modify `rotypo` causes a segmentation fault.
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
The meaning and function of `const` only partially translates
|
||||||
|
to assembly language. `const` local variables and `const`
|
||||||
|
parameters are just like any other data to assembly language.
|
||||||
|
The constant nature of `const` local variables and parameters
|
||||||
|
is implemented solely in the compiler.
|
||||||
|
|
||||||
|
`const` globals are made constant by the hardware. Attempting
|
||||||
|
to modify a variable protected in this manner will be like
|
||||||
|
poking a dragon. Best not to poke dragons.
|
||||||
6
section_1/const/const_test.cpp
Normal file
6
section_1/const/const_test.cpp
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
void Const1() {
|
||||||
|
const int foo = 9;
|
||||||
|
printf("%d\n", foo);
|
||||||
|
}
|
||||||
812
section_1/const/const_test.s
Normal file
812
section_1/const/const_test.s
Normal file
|
|
@ -0,0 +1,812 @@
|
||||||
|
.arch armv8-a
|
||||||
|
.file "const_test.cpp"
|
||||||
|
.text
|
||||||
|
.Ltext0:
|
||||||
|
.section .rodata
|
||||||
|
.align 3
|
||||||
|
.LC0:
|
||||||
|
.string "%d\n"
|
||||||
|
.text
|
||||||
|
.align 2
|
||||||
|
.global _Z6Const1v
|
||||||
|
.type _Z6Const1v, %function
|
||||||
|
_Z6Const1v:
|
||||||
|
.LFB0:
|
||||||
|
.file 1 "const_test.cpp"
|
||||||
|
.loc 1 3 15
|
||||||
|
.cfi_startproc
|
||||||
|
stp x29, x30, [sp, -32]!
|
||||||
|
.cfi_def_cfa_offset 32
|
||||||
|
.cfi_offset 29, -32
|
||||||
|
.cfi_offset 30, -24
|
||||||
|
mov x29, sp
|
||||||
|
.loc 1 4 12
|
||||||
|
mov w0, 9 // LOOK HERE - the value of 9 goes
|
||||||
|
str w0, [sp, 28] // onto the stack - this is `foo`.
|
||||||
|
.loc 1 5 8
|
||||||
|
mov w1, 9
|
||||||
|
adrp x0, .LC0
|
||||||
|
add x0, x0, :lo12:.LC0
|
||||||
|
bl printf
|
||||||
|
.loc 1 6 1
|
||||||
|
nop
|
||||||
|
ldp x29, x30, [sp], 32
|
||||||
|
.cfi_restore 30
|
||||||
|
.cfi_restore 29
|
||||||
|
.cfi_def_cfa_offset 0
|
||||||
|
ret
|
||||||
|
.cfi_endproc
|
||||||
|
.LFE0:
|
||||||
|
.size _Z6Const1v, .-_Z6Const1v
|
||||||
|
.Letext0:
|
||||||
|
.file 2 "/usr/lib/gcc/aarch64-linux-gnu/9/include/stddef.h"
|
||||||
|
.file 3 "/usr/include/aarch64-linux-gnu/bits/types.h"
|
||||||
|
.file 4 "/usr/include/aarch64-linux-gnu/bits/types/struct_FILE.h"
|
||||||
|
.file 5 "/usr/include/aarch64-linux-gnu/bits/types/FILE.h"
|
||||||
|
.file 6 "/usr/include/stdio.h"
|
||||||
|
.file 7 "/usr/include/aarch64-linux-gnu/bits/sys_errlist.h"
|
||||||
|
.section .debug_info,"",@progbits
|
||||||
|
.Ldebug_info0:
|
||||||
|
.4byte 0x325
|
||||||
|
.2byte 0x4
|
||||||
|
.4byte .Ldebug_abbrev0
|
||||||
|
.byte 0x8
|
||||||
|
.uleb128 0x1
|
||||||
|
.4byte .LASF51
|
||||||
|
.byte 0x4
|
||||||
|
.4byte .LASF52
|
||||||
|
.4byte .LASF53
|
||||||
|
.8byte .Ltext0
|
||||||
|
.8byte .Letext0-.Ltext0
|
||||||
|
.4byte .Ldebug_line0
|
||||||
|
.uleb128 0x2
|
||||||
|
.4byte .LASF7
|
||||||
|
.byte 0x2
|
||||||
|
.byte 0xd1
|
||||||
|
.byte 0x17
|
||||||
|
.4byte 0x39
|
||||||
|
.uleb128 0x3
|
||||||
|
.byte 0x8
|
||||||
|
.byte 0x7
|
||||||
|
.4byte .LASF0
|
||||||
|
.uleb128 0x4
|
||||||
|
.byte 0x8
|
||||||
|
.uleb128 0x5
|
||||||
|
.byte 0x4
|
||||||
|
.byte 0x5
|
||||||
|
.string "int"
|
||||||
|
.uleb128 0x6
|
||||||
|
.4byte 0x42
|
||||||
|
.uleb128 0x3
|
||||||
|
.byte 0x1
|
||||||
|
.byte 0x8
|
||||||
|
.4byte .LASF1
|
||||||
|
.uleb128 0x3
|
||||||
|
.byte 0x2
|
||||||
|
.byte 0x7
|
||||||
|
.4byte .LASF2
|
||||||
|
.uleb128 0x3
|
||||||
|
.byte 0x4
|
||||||
|
.byte 0x7
|
||||||
|
.4byte .LASF3
|
||||||
|
.uleb128 0x3
|
||||||
|
.byte 0x1
|
||||||
|
.byte 0x6
|
||||||
|
.4byte .LASF4
|
||||||
|
.uleb128 0x3
|
||||||
|
.byte 0x2
|
||||||
|
.byte 0x5
|
||||||
|
.4byte .LASF5
|
||||||
|
.uleb128 0x3
|
||||||
|
.byte 0x8
|
||||||
|
.byte 0x5
|
||||||
|
.4byte .LASF6
|
||||||
|
.uleb128 0x2
|
||||||
|
.4byte .LASF8
|
||||||
|
.byte 0x3
|
||||||
|
.byte 0x98
|
||||||
|
.byte 0x19
|
||||||
|
.4byte 0x71
|
||||||
|
.uleb128 0x2
|
||||||
|
.4byte .LASF9
|
||||||
|
.byte 0x3
|
||||||
|
.byte 0x99
|
||||||
|
.byte 0x1b
|
||||||
|
.4byte 0x71
|
||||||
|
.uleb128 0x7
|
||||||
|
.byte 0x8
|
||||||
|
.4byte 0x96
|
||||||
|
.uleb128 0x3
|
||||||
|
.byte 0x1
|
||||||
|
.byte 0x8
|
||||||
|
.4byte .LASF10
|
||||||
|
.uleb128 0x6
|
||||||
|
.4byte 0x96
|
||||||
|
.uleb128 0x8
|
||||||
|
.4byte .LASF54
|
||||||
|
.byte 0xd8
|
||||||
|
.byte 0x4
|
||||||
|
.byte 0x31
|
||||||
|
.byte 0x8
|
||||||
|
.4byte 0x229
|
||||||
|
.uleb128 0x9
|
||||||
|
.4byte .LASF11
|
||||||
|
.byte 0x4
|
||||||
|
.byte 0x33
|
||||||
|
.byte 0x7
|
||||||
|
.4byte 0x42
|
||||||
|
.byte 0
|
||||||
|
.uleb128 0x9
|
||||||
|
.4byte .LASF12
|
||||||
|
.byte 0x4
|
||||||
|
.byte 0x36
|
||||||
|
.byte 0x9
|
||||||
|
.4byte 0x90
|
||||||
|
.byte 0x8
|
||||||
|
.uleb128 0x9
|
||||||
|
.4byte .LASF13
|
||||||
|
.byte 0x4
|
||||||
|
.byte 0x37
|
||||||
|
.byte 0x9
|
||||||
|
.4byte 0x90
|
||||||
|
.byte 0x10
|
||||||
|
.uleb128 0x9
|
||||||
|
.4byte .LASF14
|
||||||
|
.byte 0x4
|
||||||
|
.byte 0x38
|
||||||
|
.byte 0x9
|
||||||
|
.4byte 0x90
|
||||||
|
.byte 0x18
|
||||||
|
.uleb128 0x9
|
||||||
|
.4byte .LASF15
|
||||||
|
.byte 0x4
|
||||||
|
.byte 0x39
|
||||||
|
.byte 0x9
|
||||||
|
.4byte 0x90
|
||||||
|
.byte 0x20
|
||||||
|
.uleb128 0x9
|
||||||
|
.4byte .LASF16
|
||||||
|
.byte 0x4
|
||||||
|
.byte 0x3a
|
||||||
|
.byte 0x9
|
||||||
|
.4byte 0x90
|
||||||
|
.byte 0x28
|
||||||
|
.uleb128 0x9
|
||||||
|
.4byte .LASF17
|
||||||
|
.byte 0x4
|
||||||
|
.byte 0x3b
|
||||||
|
.byte 0x9
|
||||||
|
.4byte 0x90
|
||||||
|
.byte 0x30
|
||||||
|
.uleb128 0x9
|
||||||
|
.4byte .LASF18
|
||||||
|
.byte 0x4
|
||||||
|
.byte 0x3c
|
||||||
|
.byte 0x9
|
||||||
|
.4byte 0x90
|
||||||
|
.byte 0x38
|
||||||
|
.uleb128 0x9
|
||||||
|
.4byte .LASF19
|
||||||
|
.byte 0x4
|
||||||
|
.byte 0x3d
|
||||||
|
.byte 0x9
|
||||||
|
.4byte 0x90
|
||||||
|
.byte 0x40
|
||||||
|
.uleb128 0x9
|
||||||
|
.4byte .LASF20
|
||||||
|
.byte 0x4
|
||||||
|
.byte 0x40
|
||||||
|
.byte 0x9
|
||||||
|
.4byte 0x90
|
||||||
|
.byte 0x48
|
||||||
|
.uleb128 0x9
|
||||||
|
.4byte .LASF21
|
||||||
|
.byte 0x4
|
||||||
|
.byte 0x41
|
||||||
|
.byte 0x9
|
||||||
|
.4byte 0x90
|
||||||
|
.byte 0x50
|
||||||
|
.uleb128 0x9
|
||||||
|
.4byte .LASF22
|
||||||
|
.byte 0x4
|
||||||
|
.byte 0x42
|
||||||
|
.byte 0x9
|
||||||
|
.4byte 0x90
|
||||||
|
.byte 0x58
|
||||||
|
.uleb128 0x9
|
||||||
|
.4byte .LASF23
|
||||||
|
.byte 0x4
|
||||||
|
.byte 0x44
|
||||||
|
.byte 0x16
|
||||||
|
.4byte 0x242
|
||||||
|
.byte 0x60
|
||||||
|
.uleb128 0x9
|
||||||
|
.4byte .LASF24
|
||||||
|
.byte 0x4
|
||||||
|
.byte 0x46
|
||||||
|
.byte 0x14
|
||||||
|
.4byte 0x248
|
||||||
|
.byte 0x68
|
||||||
|
.uleb128 0x9
|
||||||
|
.4byte .LASF25
|
||||||
|
.byte 0x4
|
||||||
|
.byte 0x48
|
||||||
|
.byte 0x7
|
||||||
|
.4byte 0x42
|
||||||
|
.byte 0x70
|
||||||
|
.uleb128 0x9
|
||||||
|
.4byte .LASF26
|
||||||
|
.byte 0x4
|
||||||
|
.byte 0x49
|
||||||
|
.byte 0x7
|
||||||
|
.4byte 0x42
|
||||||
|
.byte 0x74
|
||||||
|
.uleb128 0x9
|
||||||
|
.4byte .LASF27
|
||||||
|
.byte 0x4
|
||||||
|
.byte 0x4a
|
||||||
|
.byte 0xb
|
||||||
|
.4byte 0x78
|
||||||
|
.byte 0x78
|
||||||
|
.uleb128 0x9
|
||||||
|
.4byte .LASF28
|
||||||
|
.byte 0x4
|
||||||
|
.byte 0x4d
|
||||||
|
.byte 0x12
|
||||||
|
.4byte 0x55
|
||||||
|
.byte 0x80
|
||||||
|
.uleb128 0x9
|
||||||
|
.4byte .LASF29
|
||||||
|
.byte 0x4
|
||||||
|
.byte 0x4e
|
||||||
|
.byte 0xf
|
||||||
|
.4byte 0x63
|
||||||
|
.byte 0x82
|
||||||
|
.uleb128 0x9
|
||||||
|
.4byte .LASF30
|
||||||
|
.byte 0x4
|
||||||
|
.byte 0x4f
|
||||||
|
.byte 0x8
|
||||||
|
.4byte 0x24e
|
||||||
|
.byte 0x83
|
||||||
|
.uleb128 0x9
|
||||||
|
.4byte .LASF31
|
||||||
|
.byte 0x4
|
||||||
|
.byte 0x51
|
||||||
|
.byte 0xf
|
||||||
|
.4byte 0x25e
|
||||||
|
.byte 0x88
|
||||||
|
.uleb128 0x9
|
||||||
|
.4byte .LASF32
|
||||||
|
.byte 0x4
|
||||||
|
.byte 0x59
|
||||||
|
.byte 0xd
|
||||||
|
.4byte 0x84
|
||||||
|
.byte 0x90
|
||||||
|
.uleb128 0x9
|
||||||
|
.4byte .LASF33
|
||||||
|
.byte 0x4
|
||||||
|
.byte 0x5b
|
||||||
|
.byte 0x17
|
||||||
|
.4byte 0x269
|
||||||
|
.byte 0x98
|
||||||
|
.uleb128 0x9
|
||||||
|
.4byte .LASF34
|
||||||
|
.byte 0x4
|
||||||
|
.byte 0x5c
|
||||||
|
.byte 0x19
|
||||||
|
.4byte 0x274
|
||||||
|
.byte 0xa0
|
||||||
|
.uleb128 0x9
|
||||||
|
.4byte .LASF35
|
||||||
|
.byte 0x4
|
||||||
|
.byte 0x5d
|
||||||
|
.byte 0x14
|
||||||
|
.4byte 0x248
|
||||||
|
.byte 0xa8
|
||||||
|
.uleb128 0x9
|
||||||
|
.4byte .LASF36
|
||||||
|
.byte 0x4
|
||||||
|
.byte 0x5e
|
||||||
|
.byte 0x9
|
||||||
|
.4byte 0x40
|
||||||
|
.byte 0xb0
|
||||||
|
.uleb128 0x9
|
||||||
|
.4byte .LASF37
|
||||||
|
.byte 0x4
|
||||||
|
.byte 0x5f
|
||||||
|
.byte 0xa
|
||||||
|
.4byte 0x2d
|
||||||
|
.byte 0xb8
|
||||||
|
.uleb128 0x9
|
||||||
|
.4byte .LASF38
|
||||||
|
.byte 0x4
|
||||||
|
.byte 0x60
|
||||||
|
.byte 0x7
|
||||||
|
.4byte 0x42
|
||||||
|
.byte 0xc0
|
||||||
|
.uleb128 0x9
|
||||||
|
.4byte .LASF39
|
||||||
|
.byte 0x4
|
||||||
|
.byte 0x62
|
||||||
|
.byte 0x8
|
||||||
|
.4byte 0x27a
|
||||||
|
.byte 0xc4
|
||||||
|
.byte 0
|
||||||
|
.uleb128 0x2
|
||||||
|
.4byte .LASF40
|
||||||
|
.byte 0x5
|
||||||
|
.byte 0x7
|
||||||
|
.byte 0x19
|
||||||
|
.4byte 0xa2
|
||||||
|
.uleb128 0xa
|
||||||
|
.4byte .LASF55
|
||||||
|
.byte 0x4
|
||||||
|
.byte 0x2b
|
||||||
|
.byte 0xe
|
||||||
|
.uleb128 0xb
|
||||||
|
.4byte .LASF41
|
||||||
|
.uleb128 0x7
|
||||||
|
.byte 0x8
|
||||||
|
.4byte 0x23d
|
||||||
|
.uleb128 0x7
|
||||||
|
.byte 0x8
|
||||||
|
.4byte 0xa2
|
||||||
|
.uleb128 0xc
|
||||||
|
.4byte 0x96
|
||||||
|
.4byte 0x25e
|
||||||
|
.uleb128 0xd
|
||||||
|
.4byte 0x39
|
||||||
|
.byte 0
|
||||||
|
.byte 0
|
||||||
|
.uleb128 0x7
|
||||||
|
.byte 0x8
|
||||||
|
.4byte 0x235
|
||||||
|
.uleb128 0xb
|
||||||
|
.4byte .LASF42
|
||||||
|
.uleb128 0x7
|
||||||
|
.byte 0x8
|
||||||
|
.4byte 0x264
|
||||||
|
.uleb128 0xb
|
||||||
|
.4byte .LASF43
|
||||||
|
.uleb128 0x7
|
||||||
|
.byte 0x8
|
||||||
|
.4byte 0x26f
|
||||||
|
.uleb128 0xc
|
||||||
|
.4byte 0x96
|
||||||
|
.4byte 0x28a
|
||||||
|
.uleb128 0xd
|
||||||
|
.4byte 0x39
|
||||||
|
.byte 0x13
|
||||||
|
.byte 0
|
||||||
|
.uleb128 0x7
|
||||||
|
.byte 0x8
|
||||||
|
.4byte 0x9d
|
||||||
|
.uleb128 0x6
|
||||||
|
.4byte 0x28a
|
||||||
|
.uleb128 0xe
|
||||||
|
.4byte .LASF44
|
||||||
|
.byte 0x6
|
||||||
|
.byte 0x89
|
||||||
|
.byte 0xe
|
||||||
|
.4byte 0x2a1
|
||||||
|
.uleb128 0x7
|
||||||
|
.byte 0x8
|
||||||
|
.4byte 0x229
|
||||||
|
.uleb128 0xe
|
||||||
|
.4byte .LASF45
|
||||||
|
.byte 0x6
|
||||||
|
.byte 0x8a
|
||||||
|
.byte 0xe
|
||||||
|
.4byte 0x2a1
|
||||||
|
.uleb128 0xe
|
||||||
|
.4byte .LASF46
|
||||||
|
.byte 0x6
|
||||||
|
.byte 0x8b
|
||||||
|
.byte 0xe
|
||||||
|
.4byte 0x2a1
|
||||||
|
.uleb128 0xe
|
||||||
|
.4byte .LASF47
|
||||||
|
.byte 0x7
|
||||||
|
.byte 0x1a
|
||||||
|
.byte 0xc
|
||||||
|
.4byte 0x42
|
||||||
|
.uleb128 0xc
|
||||||
|
.4byte 0x290
|
||||||
|
.4byte 0x2d6
|
||||||
|
.uleb128 0xf
|
||||||
|
.byte 0
|
||||||
|
.uleb128 0xe
|
||||||
|
.4byte .LASF48
|
||||||
|
.byte 0x7
|
||||||
|
.byte 0x1b
|
||||||
|
.byte 0x1a
|
||||||
|
.4byte 0x2cb
|
||||||
|
.uleb128 0xe
|
||||||
|
.4byte .LASF49
|
||||||
|
.byte 0x7
|
||||||
|
.byte 0x1e
|
||||||
|
.byte 0xc
|
||||||
|
.4byte 0x42
|
||||||
|
.uleb128 0xe
|
||||||
|
.4byte .LASF50
|
||||||
|
.byte 0x7
|
||||||
|
.byte 0x1f
|
||||||
|
.byte 0x1a
|
||||||
|
.4byte 0x2cb
|
||||||
|
.uleb128 0x10
|
||||||
|
.4byte .LASF56
|
||||||
|
.byte 0x1
|
||||||
|
.byte 0x3
|
||||||
|
.byte 0x6
|
||||||
|
.4byte .LASF57
|
||||||
|
.8byte .LFB0
|
||||||
|
.8byte .LFE0-.LFB0
|
||||||
|
.uleb128 0x1
|
||||||
|
.byte 0x9c
|
||||||
|
.uleb128 0x11
|
||||||
|
.string "foo"
|
||||||
|
.byte 0x1
|
||||||
|
.byte 0x4
|
||||||
|
.byte 0xc
|
||||||
|
.4byte 0x49
|
||||||
|
.uleb128 0x2
|
||||||
|
.byte 0x91
|
||||||
|
.sleb128 -4
|
||||||
|
.byte 0
|
||||||
|
.byte 0
|
||||||
|
.section .debug_abbrev,"",@progbits
|
||||||
|
.Ldebug_abbrev0:
|
||||||
|
.uleb128 0x1
|
||||||
|
.uleb128 0x11
|
||||||
|
.byte 0x1
|
||||||
|
.uleb128 0x25
|
||||||
|
.uleb128 0xe
|
||||||
|
.uleb128 0x13
|
||||||
|
.uleb128 0xb
|
||||||
|
.uleb128 0x3
|
||||||
|
.uleb128 0xe
|
||||||
|
.uleb128 0x1b
|
||||||
|
.uleb128 0xe
|
||||||
|
.uleb128 0x11
|
||||||
|
.uleb128 0x1
|
||||||
|
.uleb128 0x12
|
||||||
|
.uleb128 0x7
|
||||||
|
.uleb128 0x10
|
||||||
|
.uleb128 0x17
|
||||||
|
.byte 0
|
||||||
|
.byte 0
|
||||||
|
.uleb128 0x2
|
||||||
|
.uleb128 0x16
|
||||||
|
.byte 0
|
||||||
|
.uleb128 0x3
|
||||||
|
.uleb128 0xe
|
||||||
|
.uleb128 0x3a
|
||||||
|
.uleb128 0xb
|
||||||
|
.uleb128 0x3b
|
||||||
|
.uleb128 0xb
|
||||||
|
.uleb128 0x39
|
||||||
|
.uleb128 0xb
|
||||||
|
.uleb128 0x49
|
||||||
|
.uleb128 0x13
|
||||||
|
.byte 0
|
||||||
|
.byte 0
|
||||||
|
.uleb128 0x3
|
||||||
|
.uleb128 0x24
|
||||||
|
.byte 0
|
||||||
|
.uleb128 0xb
|
||||||
|
.uleb128 0xb
|
||||||
|
.uleb128 0x3e
|
||||||
|
.uleb128 0xb
|
||||||
|
.uleb128 0x3
|
||||||
|
.uleb128 0xe
|
||||||
|
.byte 0
|
||||||
|
.byte 0
|
||||||
|
.uleb128 0x4
|
||||||
|
.uleb128 0xf
|
||||||
|
.byte 0
|
||||||
|
.uleb128 0xb
|
||||||
|
.uleb128 0xb
|
||||||
|
.byte 0
|
||||||
|
.byte 0
|
||||||
|
.uleb128 0x5
|
||||||
|
.uleb128 0x24
|
||||||
|
.byte 0
|
||||||
|
.uleb128 0xb
|
||||||
|
.uleb128 0xb
|
||||||
|
.uleb128 0x3e
|
||||||
|
.uleb128 0xb
|
||||||
|
.uleb128 0x3
|
||||||
|
.uleb128 0x8
|
||||||
|
.byte 0
|
||||||
|
.byte 0
|
||||||
|
.uleb128 0x6
|
||||||
|
.uleb128 0x26
|
||||||
|
.byte 0
|
||||||
|
.uleb128 0x49
|
||||||
|
.uleb128 0x13
|
||||||
|
.byte 0
|
||||||
|
.byte 0
|
||||||
|
.uleb128 0x7
|
||||||
|
.uleb128 0xf
|
||||||
|
.byte 0
|
||||||
|
.uleb128 0xb
|
||||||
|
.uleb128 0xb
|
||||||
|
.uleb128 0x49
|
||||||
|
.uleb128 0x13
|
||||||
|
.byte 0
|
||||||
|
.byte 0
|
||||||
|
.uleb128 0x8
|
||||||
|
.uleb128 0x13
|
||||||
|
.byte 0x1
|
||||||
|
.uleb128 0x3
|
||||||
|
.uleb128 0xe
|
||||||
|
.uleb128 0xb
|
||||||
|
.uleb128 0xb
|
||||||
|
.uleb128 0x3a
|
||||||
|
.uleb128 0xb
|
||||||
|
.uleb128 0x3b
|
||||||
|
.uleb128 0xb
|
||||||
|
.uleb128 0x39
|
||||||
|
.uleb128 0xb
|
||||||
|
.uleb128 0x1
|
||||||
|
.uleb128 0x13
|
||||||
|
.byte 0
|
||||||
|
.byte 0
|
||||||
|
.uleb128 0x9
|
||||||
|
.uleb128 0xd
|
||||||
|
.byte 0
|
||||||
|
.uleb128 0x3
|
||||||
|
.uleb128 0xe
|
||||||
|
.uleb128 0x3a
|
||||||
|
.uleb128 0xb
|
||||||
|
.uleb128 0x3b
|
||||||
|
.uleb128 0xb
|
||||||
|
.uleb128 0x39
|
||||||
|
.uleb128 0xb
|
||||||
|
.uleb128 0x49
|
||||||
|
.uleb128 0x13
|
||||||
|
.uleb128 0x38
|
||||||
|
.uleb128 0xb
|
||||||
|
.byte 0
|
||||||
|
.byte 0
|
||||||
|
.uleb128 0xa
|
||||||
|
.uleb128 0x16
|
||||||
|
.byte 0
|
||||||
|
.uleb128 0x3
|
||||||
|
.uleb128 0xe
|
||||||
|
.uleb128 0x3a
|
||||||
|
.uleb128 0xb
|
||||||
|
.uleb128 0x3b
|
||||||
|
.uleb128 0xb
|
||||||
|
.uleb128 0x39
|
||||||
|
.uleb128 0xb
|
||||||
|
.byte 0
|
||||||
|
.byte 0
|
||||||
|
.uleb128 0xb
|
||||||
|
.uleb128 0x13
|
||||||
|
.byte 0
|
||||||
|
.uleb128 0x3
|
||||||
|
.uleb128 0xe
|
||||||
|
.uleb128 0x3c
|
||||||
|
.uleb128 0x19
|
||||||
|
.byte 0
|
||||||
|
.byte 0
|
||||||
|
.uleb128 0xc
|
||||||
|
.uleb128 0x1
|
||||||
|
.byte 0x1
|
||||||
|
.uleb128 0x49
|
||||||
|
.uleb128 0x13
|
||||||
|
.uleb128 0x1
|
||||||
|
.uleb128 0x13
|
||||||
|
.byte 0
|
||||||
|
.byte 0
|
||||||
|
.uleb128 0xd
|
||||||
|
.uleb128 0x21
|
||||||
|
.byte 0
|
||||||
|
.uleb128 0x49
|
||||||
|
.uleb128 0x13
|
||||||
|
.uleb128 0x2f
|
||||||
|
.uleb128 0xb
|
||||||
|
.byte 0
|
||||||
|
.byte 0
|
||||||
|
.uleb128 0xe
|
||||||
|
.uleb128 0x34
|
||||||
|
.byte 0
|
||||||
|
.uleb128 0x3
|
||||||
|
.uleb128 0xe
|
||||||
|
.uleb128 0x3a
|
||||||
|
.uleb128 0xb
|
||||||
|
.uleb128 0x3b
|
||||||
|
.uleb128 0xb
|
||||||
|
.uleb128 0x39
|
||||||
|
.uleb128 0xb
|
||||||
|
.uleb128 0x49
|
||||||
|
.uleb128 0x13
|
||||||
|
.uleb128 0x3f
|
||||||
|
.uleb128 0x19
|
||||||
|
.uleb128 0x3c
|
||||||
|
.uleb128 0x19
|
||||||
|
.byte 0
|
||||||
|
.byte 0
|
||||||
|
.uleb128 0xf
|
||||||
|
.uleb128 0x21
|
||||||
|
.byte 0
|
||||||
|
.byte 0
|
||||||
|
.byte 0
|
||||||
|
.uleb128 0x10
|
||||||
|
.uleb128 0x2e
|
||||||
|
.byte 0x1
|
||||||
|
.uleb128 0x3f
|
||||||
|
.uleb128 0x19
|
||||||
|
.uleb128 0x3
|
||||||
|
.uleb128 0xe
|
||||||
|
.uleb128 0x3a
|
||||||
|
.uleb128 0xb
|
||||||
|
.uleb128 0x3b
|
||||||
|
.uleb128 0xb
|
||||||
|
.uleb128 0x39
|
||||||
|
.uleb128 0xb
|
||||||
|
.uleb128 0x6e
|
||||||
|
.uleb128 0xe
|
||||||
|
.uleb128 0x11
|
||||||
|
.uleb128 0x1
|
||||||
|
.uleb128 0x12
|
||||||
|
.uleb128 0x7
|
||||||
|
.uleb128 0x40
|
||||||
|
.uleb128 0x18
|
||||||
|
.uleb128 0x2116
|
||||||
|
.uleb128 0x19
|
||||||
|
.byte 0
|
||||||
|
.byte 0
|
||||||
|
.uleb128 0x11
|
||||||
|
.uleb128 0x34
|
||||||
|
.byte 0
|
||||||
|
.uleb128 0x3
|
||||||
|
.uleb128 0x8
|
||||||
|
.uleb128 0x3a
|
||||||
|
.uleb128 0xb
|
||||||
|
.uleb128 0x3b
|
||||||
|
.uleb128 0xb
|
||||||
|
.uleb128 0x39
|
||||||
|
.uleb128 0xb
|
||||||
|
.uleb128 0x49
|
||||||
|
.uleb128 0x13
|
||||||
|
.uleb128 0x2
|
||||||
|
.uleb128 0x18
|
||||||
|
.byte 0
|
||||||
|
.byte 0
|
||||||
|
.byte 0
|
||||||
|
.section .debug_aranges,"",@progbits
|
||||||
|
.4byte 0x2c
|
||||||
|
.2byte 0x2
|
||||||
|
.4byte .Ldebug_info0
|
||||||
|
.byte 0x8
|
||||||
|
.byte 0
|
||||||
|
.2byte 0
|
||||||
|
.2byte 0
|
||||||
|
.8byte .Ltext0
|
||||||
|
.8byte .Letext0-.Ltext0
|
||||||
|
.8byte 0
|
||||||
|
.8byte 0
|
||||||
|
.section .debug_line,"",@progbits
|
||||||
|
.Ldebug_line0:
|
||||||
|
.section .debug_str,"MS",@progbits,1
|
||||||
|
.LASF19:
|
||||||
|
.string "_IO_buf_end"
|
||||||
|
.LASF27:
|
||||||
|
.string "_old_offset"
|
||||||
|
.LASF47:
|
||||||
|
.string "sys_nerr"
|
||||||
|
.LASF22:
|
||||||
|
.string "_IO_save_end"
|
||||||
|
.LASF5:
|
||||||
|
.string "short int"
|
||||||
|
.LASF7:
|
||||||
|
.string "size_t"
|
||||||
|
.LASF32:
|
||||||
|
.string "_offset"
|
||||||
|
.LASF16:
|
||||||
|
.string "_IO_write_ptr"
|
||||||
|
.LASF11:
|
||||||
|
.string "_flags"
|
||||||
|
.LASF18:
|
||||||
|
.string "_IO_buf_base"
|
||||||
|
.LASF23:
|
||||||
|
.string "_markers"
|
||||||
|
.LASF13:
|
||||||
|
.string "_IO_read_end"
|
||||||
|
.LASF36:
|
||||||
|
.string "_freeres_buf"
|
||||||
|
.LASF57:
|
||||||
|
.string "_Z6Const1v"
|
||||||
|
.LASF50:
|
||||||
|
.string "_sys_errlist"
|
||||||
|
.LASF46:
|
||||||
|
.string "stderr"
|
||||||
|
.LASF51:
|
||||||
|
.string "GNU C++14 9.4.0 -mlittle-endian -mabi=lp64 -g -fasynchronous-unwind-tables -fstack-protector-strong -fstack-clash-protection"
|
||||||
|
.LASF31:
|
||||||
|
.string "_lock"
|
||||||
|
.LASF6:
|
||||||
|
.string "long int"
|
||||||
|
.LASF28:
|
||||||
|
.string "_cur_column"
|
||||||
|
.LASF49:
|
||||||
|
.string "_sys_nerr"
|
||||||
|
.LASF29:
|
||||||
|
.string "_vtable_offset"
|
||||||
|
.LASF54:
|
||||||
|
.string "_IO_FILE"
|
||||||
|
.LASF1:
|
||||||
|
.string "unsigned char"
|
||||||
|
.LASF4:
|
||||||
|
.string "signed char"
|
||||||
|
.LASF33:
|
||||||
|
.string "_codecvt"
|
||||||
|
.LASF3:
|
||||||
|
.string "unsigned int"
|
||||||
|
.LASF41:
|
||||||
|
.string "_IO_marker"
|
||||||
|
.LASF30:
|
||||||
|
.string "_shortbuf"
|
||||||
|
.LASF15:
|
||||||
|
.string "_IO_write_base"
|
||||||
|
.LASF39:
|
||||||
|
.string "_unused2"
|
||||||
|
.LASF12:
|
||||||
|
.string "_IO_read_ptr"
|
||||||
|
.LASF2:
|
||||||
|
.string "short unsigned int"
|
||||||
|
.LASF10:
|
||||||
|
.string "char"
|
||||||
|
.LASF56:
|
||||||
|
.string "Const1"
|
||||||
|
.LASF34:
|
||||||
|
.string "_wide_data"
|
||||||
|
.LASF35:
|
||||||
|
.string "_freeres_list"
|
||||||
|
.LASF37:
|
||||||
|
.string "__pad5"
|
||||||
|
.LASF42:
|
||||||
|
.string "_IO_codecvt"
|
||||||
|
.LASF0:
|
||||||
|
.string "long unsigned int"
|
||||||
|
.LASF17:
|
||||||
|
.string "_IO_write_end"
|
||||||
|
.LASF9:
|
||||||
|
.string "__off64_t"
|
||||||
|
.LASF8:
|
||||||
|
.string "__off_t"
|
||||||
|
.LASF24:
|
||||||
|
.string "_chain"
|
||||||
|
.LASF43:
|
||||||
|
.string "_IO_wide_data"
|
||||||
|
.LASF52:
|
||||||
|
.string "const_test.cpp"
|
||||||
|
.LASF21:
|
||||||
|
.string "_IO_backup_base"
|
||||||
|
.LASF44:
|
||||||
|
.string "stdin"
|
||||||
|
.LASF26:
|
||||||
|
.string "_flags2"
|
||||||
|
.LASF38:
|
||||||
|
.string "_mode"
|
||||||
|
.LASF14:
|
||||||
|
.string "_IO_read_base"
|
||||||
|
.LASF53:
|
||||||
|
.string "/media/psf/Home/Documents/asm_book/section_1/const"
|
||||||
|
.LASF20:
|
||||||
|
.string "_IO_save_base"
|
||||||
|
.LASF48:
|
||||||
|
.string "sys_errlist"
|
||||||
|
.LASF25:
|
||||||
|
.string "_fileno"
|
||||||
|
.LASF40:
|
||||||
|
.string "FILE"
|
||||||
|
.LASF45:
|
||||||
|
.string "stdout"
|
||||||
|
.LASF55:
|
||||||
|
.string "_IO_lock_t"
|
||||||
|
.ident "GCC: (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0"
|
||||||
|
.section .note.GNU-stack,"",@progbits
|
||||||
33
section_1/const/rodata.s
Normal file
33
section_1/const/rodata.s
Normal file
|
|
@ -0,0 +1,33 @@
|
||||||
|
.global main
|
||||||
|
.align 2
|
||||||
|
|
||||||
|
.section .rodata
|
||||||
|
rotypo: .asciz "Rypo" // Meant this to be "Typo"
|
||||||
|
fmt: .asciz "%s\n" // Used to print the strings
|
||||||
|
|
||||||
|
.data
|
||||||
|
rwtypo: .asciz "Rypo" // Meant this to be "Typo"
|
||||||
|
|
||||||
|
.text
|
||||||
|
|
||||||
|
main: str x30, [sp, -16]!
|
||||||
|
// Try to fix rwtypo --- this will work
|
||||||
|
ldr x1, =rwtypo
|
||||||
|
mov w2, 'T'
|
||||||
|
strb w2, [x1]
|
||||||
|
ldr x0, =fmt // Notice I already loaded rwtypo
|
||||||
|
bl printf
|
||||||
|
|
||||||
|
// Try to fix rotypo --- this will end in tears
|
||||||
|
ldr x1, =rotypo
|
||||||
|
mov w2, 'T'
|
||||||
|
strb w2, [x1]
|
||||||
|
ldr x0, =fmt // Notice I already loaded rwtypo
|
||||||
|
bl printf
|
||||||
|
|
||||||
|
ldr x30, [sp], 16
|
||||||
|
mov w0, wzr
|
||||||
|
ret
|
||||||
|
|
||||||
|
.end
|
||||||
|
|
||||||
Loading…
Reference in a new issue