Sup! I've been working on sixlang and got an idea - to make increasing / decreasing operators (like in C). Rust's += 1 generates add 1, not inc. I tried to do this via core::arch::asm but it passes arguments through registers so i did only this. Does someone know how can i pass an address without in(reg)?
That code is correct except for that
&A needs to be
&mut A to avoid UB. The generated assembly looks correct.
Mutability is not the case. Take a look at generated assembly code
main: push rax lea rax, [rip + _ZN10playground4main1A17h10aff76bb05bbbb6E] inc byte ptr [rax] pop rax ret _ZN10playground4main1A17h10aff76bb05bbbb6E: .zero 1
I can only get access to A via rax or other registers if i use inout(reg). I need
main: inc [_ZN10playground4main1A17h10aff76bb05bbbb6E] ret _ZN10playground4main1A17h10aff76bb05bbbb6E: .zero 1
You don't need
inout as the reference itself doesn't get mutated. Also
lea rax, [rip + _ZN10playground4main1A17h10aff76bb05bbbb6E] inc byte ptr [rax]
inc byte ptr [rip + _ZN10playground4main1A17h10aff76bb05bbbb6E]
do exactly the same. The only difference is that the first splits the address computation out, while the second doesn't.
I meant in or out or inout but it’s not the case. Passing arguments via register doesn’t give us additional performance this time and makes our binary bigger. I just need direct access to label, so don’t try to bring me over please. If you know how to do what I need directly, please tell me how to, otherwise thank you for wasting time on me, but your advices, I think, will be useless
If you can use nightly, this will work: Rust Playground If not, I don't think there is anything else you can do.
Thank you! That is it
There is only one problem: i get linker error while trying to run your code. Looks like statics are allocated in .rodata and mutable statics in .bss, not in .data
UPD: I applied #[link_section = ".data"] but it wasn't a solution, i still get same linker error.
relocation R_X86_64_32S against `.bss._ZN10playground4main1A17hf2a75aa4b04c1505E' can not be used when making a PIE object; recompile with -fPIE
relocation R_X86_64_32S against `.data' can not be used when making a PIE object; recompile with -fPIE
Right, forgot the
rip + as necessary for position independent code: Rust Playground
Only zero initialized statics. .bss isn't stored on the disk, but initialized with zeros by the dynamic linker. This saves space. Other than that there is no difference between .data and .bss.
Yeah, thanks, i understood!
This topic was automatically closed 90 days after the last reply. We invite you to open a new topic if you have further questions or comments.