Assembler x64 ( pomoc s domácím úkolem)

Místo pro dotazy a rady ohledně programovacích jazyků (C++, C#, PHP, ASP, Javascript, VBS..) a tvorby webových stránek

Moderátor: Mods_senior

Uživatelský avatar
Zakk
Level 3.5
Level 3.5
Příspěvky: 713
Registrován: únor 13
Pohlaví: Muž
Stav:
Offline

Assembler x64 ( pomoc s domácím úkolem)

Příspěvekod Zakk » 22 dub 2018 14:48

Zdravím.

Dělám úkol z assembleru a nevím si rady.
Problém je v tom, že nevím, jak zapsat do pole.


Například mám pole pojmenované "hist" a chtěl bych do pole přiřadit nulu ( na místo, kde mám zrovna pointer).

Takže si pointer nastavím na začátek pole
lea rbx, hist[rip] /* pointer na začátek pole histogram,*/

A v cyklu mu přiřazuju 0.

cycle:
mov [rbx], 0 /* prvku pole přiřaď nulu */ -- tenhle řádek je špatně
add rbx,8 /* posun ukazatele*/

dec rcx /* zmenšení iterátoru* i++(respektive v našem případě i--)/
jnz cycle /* skok na cyklus*/

a prostě nevím, jak to zapsat zkoušel jsem ještě: mov, hist[rbx]... mov, hist[rip].. prostě nevím, jak tohle zapsat a vygooglit se mi taky moc nic nepodařilo.

Budu vděčný za každou radu.

Reklama
Uživatelský avatar
satik
Level 6
Level 6
Příspěvky: 3509
Registrován: leden 15
Bydliště: Krkonoše
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: Assembler x64 ( pomoc s domácím úkolem)

Příspěvekod satik » 22 dub 2018 17:11

RIP je registr s offsetem pro aktuálně prováděnou instrukci, ten tam určitě používat nechceš. Takze ve výsledku ukládáš do rbx nějakou celkem náhodnou adresu, místo začátku pole.
PC: MSI RTX 4090 Suprim X, AMD Ryzen 9 7950x3D, ASUS Crosshair HERO X6670E, 64GB RAM@6000CL30, Fractal Define Torrent, Seasonic PRIME TX 1600W, SSD Seagate Firecuda 530 M2 2TB +
4TB + 4TB SATA Micron 5200 ECO
Periferie: Samsung Odyssey G9 Neo + 2x AOC AG271QG, Razer Deathadder, Ducky Shine7, Steelseries QcK+, Beyerdynamic MMX300, Valve Index

Uživatelský avatar
Zakk
Level 3.5
Level 3.5
Příspěvky: 713
Registrován: únor 13
Pohlaví: Muž
Stav:
Offline

Re: Assembler x64 ( pomoc s domácím úkolem)

Příspěvekod Zakk » 22 dub 2018 17:32

Takže říkáš, že mám špatně tenhle řádek

lea rbx, hist[rip] /* pointer na začátek pole histogram,*

?

Pamatuju si, že takhle to ten učitel psal.

Uživatelský avatar
satik
Level 6
Level 6
Příspěvky: 3509
Registrován: leden 15
Bydliště: Krkonoše
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: Assembler x64 ( pomoc s domácím úkolem)

Příspěvekod satik » 22 dub 2018 18:15

Určitě tam neměl RIP nebo se upsal, smysl by dávalo RSP.
PC: MSI RTX 4090 Suprim X, AMD Ryzen 9 7950x3D, ASUS Crosshair HERO X6670E, 64GB RAM@6000CL30, Fractal Define Torrent, Seasonic PRIME TX 1600W, SSD Seagate Firecuda 530 M2 2TB +
4TB + 4TB SATA Micron 5200 ECO
Periferie: Samsung Odyssey G9 Neo + 2x AOC AG271QG, Razer Deathadder, Ducky Shine7, Steelseries QcK+, Beyerdynamic MMX300, Valve Index

Uživatelský avatar
Zakk
Level 3.5
Level 3.5
Příspěvky: 713
Registrován: únor 13
Pohlaví: Muž
Stav:
Offline

Re: Assembler x64 ( pomoc s domácím úkolem)

Příspěvekod Zakk » 22 dub 2018 18:37

Opravdu to tam takhle psal a nebylo to jen jednou a myslím, že mu to i fungovalo.

Tady mám vzorový příklad ( přepsat z javy do asm x86_64)

long arr_a[] = { 10, 20, 30, 40, 0 };
long i = 0;
long y = 0;
long v;
do {
v = arr_a[i];
y += v;
i++;
} while (v != 0);

reseni:
xor rax, rax /* y = 0 */
lea rbx, arr_a[rip] /* rbx <- adresa pole arr_a */
cycle:
mov rcx, [rbx] /* v = arr_a[i]; */
add rax, rcx /* y += v; */
add rbx, 8 /* i++ */
test rcx, rcx
jnz cycle /* while (v != 0) */
call print_rax


jinak můj příklad vypadá takhle
zadánío.jpg


a takhle je moje prozatimní řešení

lea rax, pole[rip] /* pointer na začátek pole pole*/
lea rbx, hist[rip] /* pointer na začátek pole histogram,*/
mov rcx, pocetBinu /* iterátor pocetBinu do rcx kvůli cyklu */

cycle:
mov [rbx], 0 /* prvku pole přiřaď nulu */
add rbx,8 /* posun ukazatele*/
dec rcx /* zmenšení iterátoru* i++(respektive v našem případě i--)/
jnz cycle /* skok na cyklus*/

/*cyklus na vynulování části pole možná zybtečný, když je pole inicializované na smaé nuly ?? */

mov rdx, delka /* nastaví iterátor podle délky */

cycle2:
mov rbx, [rax] /*přiřadí do rbx,hodnotu pole na pozici i (kde je pointer), prvek=pole[i] */
add rax,8 /* posun ukazatele v poli*/

/* if */
cmp prvek[rip], pocetBinu[rip] /*porovnání proměnné prvek a proměnné pocetBinu*/
jb prikaz /*pokud je prvek menší proveď prikaz*/

prikaz:
add [rbx],1 /* zvětšení hist na pozici kde je pointer (hist[prvek]++) */

dec rdx /*zmenšení iterátoru* i++(respektive v našem případě i--)*/
jnz cycle2 /*skok na cyklus*/

/*tisk*/
call print_all


V těch červených řádcích to hlásí chybu a nejde to zkompilovat.
Možná to mám celé uplně špatně.

Co by si mi teda poradil ?
Díky

Uživatelský avatar
satik
Level 6
Level 6
Příspěvky: 3509
Registrován: leden 15
Bydliště: Krkonoše
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: Assembler x64 ( pomoc s domácím úkolem)

Příspěvekod satik » 22 dub 2018 19:17

Hm, koukam, ze v x64 je mozny nejak pouzivat rip i na adresovani, viz. https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/x64-architecture :
x64 provides a new rip-relative addressing mode. Instructions that refer to a single constant address are encoded as offsets from rip. For example, the mov rax, [addr] instruction moves 8 bytes beginning at addr + rip to rax.

Ale nikdy jsem to nepoužil, asm aktivně už skoro vůbec nepoužívám :)

Vadí tomu nejspíš to, že tam nemáš velikost, musíš tomu dát vědět, jak velkej blok dat tam chceš.

Takže kód

Kód: Vybrat vše

mov [rbx], 0

změnit na něco jako

Kód: Vybrat vše

mov dword ptr [rbx], 0


Některej kompilátor to může chtít napsaný třeba velkýma písmenama apod, to musíš do dokumentace.
PC: MSI RTX 4090 Suprim X, AMD Ryzen 9 7950x3D, ASUS Crosshair HERO X6670E, 64GB RAM@6000CL30, Fractal Define Torrent, Seasonic PRIME TX 1600W, SSD Seagate Firecuda 530 M2 2TB +
4TB + 4TB SATA Micron 5200 ECO
Periferie: Samsung Odyssey G9 Neo + 2x AOC AG271QG, Razer Deathadder, Ducky Shine7, Steelseries QcK+, Beyerdynamic MMX300, Valve Index

Uživatelský avatar
Zakk
Level 3.5
Level 3.5
Příspěvky: 713
Registrován: únor 13
Pohlaví: Muž
Stav:
Offline

Re: Assembler x64 ( pomoc s domácím úkolem)

Příspěvekod Zakk » 22 dub 2018 20:20

Zdá se, že to pomohlo díky moc.

Ale pořád nevím, co s tím řádkem:
cmp prvek[rip], pocetBinu[rip]/*porovnání proměnné prvek a proměnné pocetBinu*/
jb prikaz /*pokud je prvek menší proveď prikaz*/
prikaz:
add [rbx],1 /* zvětšení hist na pozici kde je pointer (hist[prvek]++) *

a píše mi to " too many memory references for cmp"

Uživatelský avatar
satik
Level 6
Level 6
Příspěvky: 3509
Registrován: leden 15
Bydliště: Krkonoše
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: Assembler x64 ( pomoc s domácím úkolem)

Příspěvekod satik » 22 dub 2018 20:51

vytahej ty hodnoty z polí do registrů

Dodatečně přidáno po 8 minutách 10 vteřinách:
nebo možná stačí i jen jednu, ono ve většině operací (možná všude?) můžeš do paměti šahat maximálně na jednom místě, zbylá hodnota musí bejt konstanta nebo registr
PC: MSI RTX 4090 Suprim X, AMD Ryzen 9 7950x3D, ASUS Crosshair HERO X6670E, 64GB RAM@6000CL30, Fractal Define Torrent, Seasonic PRIME TX 1600W, SSD Seagate Firecuda 530 M2 2TB +
4TB + 4TB SATA Micron 5200 ECO
Periferie: Samsung Odyssey G9 Neo + 2x AOC AG271QG, Razer Deathadder, Ducky Shine7, Steelseries QcK+, Beyerdynamic MMX300, Valve Index

Uživatelský avatar
Zakk
Level 3.5
Level 3.5
Příspěvky: 713
Registrován: únor 13
Pohlaví: Muž
Stav:
Offline

Re: Assembler x64 ( pomoc s domácím úkolem)

Příspěvekod Zakk » 22 dub 2018 22:34

Tak když dám jednu do registru tak je to lepší (druhou už nevím,kam bych nacpal, když mám zaplněné rax, rbx, rcx i rdx).
Pořád se tomu ale něco nezdá

student.o:student.as:(.text+0x16): relocation truncated to fit: R_X86_64_32S against `.data'
student.o:student.as:(.text+0x2b): relocation truncated to fit: R_X86_64_32S against `.data'
collect2: error: ld returned 1 exit status
make: *** [Makefile:11: main] Chyba 1

Už asi otravuju, ale opravdu nevím jak to celé vyřešit..

Uživatelský avatar
satik
Level 6
Level 6
Příspěvky: 3509
Registrován: leden 15
Bydliště: Krkonoše
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: Assembler x64 ( pomoc s domácím úkolem)

Příspěvekod satik » 22 dub 2018 23:03

Tech registru mas hromadu, muzes vybirat, jen bacha at nepouzijes nakej, co ma naky jiny vyuziti, takze idealne pouzit ty s cislama :)
https://docs.microsoft.com/en-us/window ... chitecture

Pripadne stack, tam muzes jakejkoliv registr pushnout a pak popnout.

To relocation netusim, jestli to nahodou nesouvisi s tim vyuzitim RIP? Fakt netusim :)
PC: MSI RTX 4090 Suprim X, AMD Ryzen 9 7950x3D, ASUS Crosshair HERO X6670E, 64GB RAM@6000CL30, Fractal Define Torrent, Seasonic PRIME TX 1600W, SSD Seagate Firecuda 530 M2 2TB +
4TB + 4TB SATA Micron 5200 ECO
Periferie: Samsung Odyssey G9 Neo + 2x AOC AG271QG, Razer Deathadder, Ducky Shine7, Steelseries QcK+, Beyerdynamic MMX300, Valve Index

Uživatelský avatar
Zakk
Level 3.5
Level 3.5
Příspěvky: 713
Registrován: únor 13
Pohlaví: Muž
Stav:
Offline

Re: Assembler x64 ( pomoc s domácím úkolem)

Příspěvekod Zakk » 23 dub 2018 20:23

Tak to bylo tím, že mi chybělo [rip], když jsem tahal ty proměnné do registrů.
mov rcx, pocetBinu[rip] /* pocetBinu do rcx */
mov rdx, delka[rip] /* nastaví iterátor podle délky */

Teď už se mi to zkompilovat podařilo. Ale spustit o nejde.. nemám tam teda ještě žádnej tisk, ale i tak vyhodí to
" make: * [Makefile:18: run] Segmentation fault (obraz paměti uložen)"

Celé jsem to trochu překopal něco jsme tam měl špatně, takže teď ten kód vypadá takle

lea rax, pole[rip] /* pointer na začátek pole pole*/
lea rbx, hist[rip] /* pointer na začátek pole histogram,*/
mov rcx, pocetBinu[rip] /* pocetBinu do rcx */
mov rdx, delka[rip] /* nastaví iterátor podle délky */

cycle2:
mov rbx, [rax] /*přiřadí do rbx,hodnotu pole na pozici i (kde je pointer), prvek=pole[i] */
add rax,8 /* posun ukazatele v poli*/

cmp rbx, rcx /*porovnání pole[i] a pocetBinu*/
jb prikaz /*pokud je pole[i] menší proveď prikaz*/
prikaz:
add dword ptr [rbx],1 /* zvětšení hist na pozici kde je pointer (hist[prvek]++) */

dec rdx /*zmenšení iterátoru* i++(respektive v našem případě i--)*/
jnz cycle2 /*skok na cyklus*/

Zkoušel jsem dávat všude prity abych zjistil, kde se to pokazí a vypadá na řádek " jb prikaz".

Uživatelský avatar
satik
Level 6
Level 6
Příspěvky: 3509
Registrován: leden 15
Bydliště: Krkonoše
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: Assembler x64 ( pomoc s domácím úkolem)

Příspěvekod satik » 23 dub 2018 20:37

jb prikaz
tady nedava smysl, skaces na dalsi radek, ale to samy se stane i kdyz neskocis

Trochu me tam vsude desej ty rip, spis bych tam misto nich, netusim, co presne delaji, asi bych to osobne psal bez nich :/
PC: MSI RTX 4090 Suprim X, AMD Ryzen 9 7950x3D, ASUS Crosshair HERO X6670E, 64GB RAM@6000CL30, Fractal Define Torrent, Seasonic PRIME TX 1600W, SSD Seagate Firecuda 530 M2 2TB +
4TB + 4TB SATA Micron 5200 ECO
Periferie: Samsung Odyssey G9 Neo + 2x AOC AG271QG, Razer Deathadder, Ducky Shine7, Steelseries QcK+, Beyerdynamic MMX300, Valve Index


  • Mohlo by vás zajímat
    Odpovědi
    Zobrazení
    Poslední příspěvek
  • Pomoc s výběrem HW
    od adelafridrichova » 13 dub 2023 20:41 » v Rady s výběrem hw a sestavením PC
    6
    2107
    od Karrex Zobrazit poslední příspěvek
    14 dub 2023 14:09
  • Pomoc se sestavením PC 45-50K
    od Kvp2 » 03 lis 2023 23:27 » v Rady s výběrem hw a sestavením PC
    22
    2623
    od Kvp2 Zobrazit poslední příspěvek
    12 lis 2023 20:39
  • Pomoc s nastavením MikroTik Příloha(y)
    od souky5 » 04 pro 2023 19:16 » v Sítě - hardware
    1
    1198
    od zeus Zobrazit poslední příspěvek
    04 pro 2023 22:07
  • Kontrola+pomoc se sestavením NEW PC (do 70 tis.)
    od Petersfree » 15 pro 2023 21:10 » v Rady s výběrem hw a sestavením PC
    7
    1141
    od Petersfree Zobrazit poslední příspěvek
    22 pro 2023 06:55
  • Pomoc / Stavění PC do 20K / Nováček Příloha(y)
    od blatantq » 16 pro 2023 18:38 » v Rady s výběrem hw a sestavením PC
    32
    1445
    od Martab Zobrazit poslední příspěvek
    26 pro 2023 11:04

Zpět na “Programování a tvorba webu”

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 2 hosti