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
Level 3
Příspěvky: 480
Registrován: únor 13
Pohlaví: Muž

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 5.5
Level 5.5
Příspěvky: 3092
Registrován: leden 15
Bydliště: Praha / Krkonoše
Pohlaví: Muž

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.
https://www.facebook.com/peasantsandcastles/
https://www.twitch.tv/satikcz/
https://www.youtube.com/c/SatikCZE
PC: Intel Core i7 8700K@5GHz+EK KIT L360, ASUS Maximus X HERO, 32GB RAM@3466, MSI RTX 2080Ti Trio, Fractal Define S, Seasonic P860, M2 1TB + 2TB SSD
Periferie: 3x AOC AG271QG (1440p 165Hz IPS), Razer Deathadder+Blackadder Chroma, Steelseries QcK+, Sennheiser PC360, DXRACER OH/KF06/NB

Uživatelský avatar
Zakk
Level 3
Level 3
Příspěvky: 480
Registrován: únor 13
Pohlaví: Muž

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 5.5
Level 5.5
Příspěvky: 3092
Registrován: leden 15
Bydliště: Praha / Krkonoše
Pohlaví: Muž

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.
https://www.facebook.com/peasantsandcastles/
https://www.twitch.tv/satikcz/
https://www.youtube.com/c/SatikCZE
PC: Intel Core i7 8700K@5GHz+EK KIT L360, ASUS Maximus X HERO, 32GB RAM@3466, MSI RTX 2080Ti Trio, Fractal Define S, Seasonic P860, M2 1TB + 2TB SSD
Periferie: 3x AOC AG271QG (1440p 165Hz IPS), Razer Deathadder+Blackadder Chroma, Steelseries QcK+, Sennheiser PC360, DXRACER OH/KF06/NB

Uživatelský avatar
Zakk
Level 3
Level 3
Příspěvky: 480
Registrován: únor 13
Pohlaví: Muž

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
Nemáte oprávnění prohlížet přiložené soubory.

Uživatelský avatar
satik
Level 5.5
Level 5.5
Příspěvky: 3092
Registrován: leden 15
Bydliště: Praha / Krkonoše
Pohlaví: Muž

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.
https://www.facebook.com/peasantsandcastles/
https://www.twitch.tv/satikcz/
https://www.youtube.com/c/SatikCZE
PC: Intel Core i7 8700K@5GHz+EK KIT L360, ASUS Maximus X HERO, 32GB RAM@3466, MSI RTX 2080Ti Trio, Fractal Define S, Seasonic P860, M2 1TB + 2TB SSD
Periferie: 3x AOC AG271QG (1440p 165Hz IPS), Razer Deathadder+Blackadder Chroma, Steelseries QcK+, Sennheiser PC360, DXRACER OH/KF06/NB

Uživatelský avatar
Zakk
Level 3
Level 3
Příspěvky: 480
Registrován: únor 13
Pohlaví: Muž

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 5.5
Level 5.5
Příspěvky: 3092
Registrován: leden 15
Bydliště: Praha / Krkonoše
Pohlaví: Muž

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
https://www.facebook.com/peasantsandcastles/
https://www.twitch.tv/satikcz/
https://www.youtube.com/c/SatikCZE
PC: Intel Core i7 8700K@5GHz+EK KIT L360, ASUS Maximus X HERO, 32GB RAM@3466, MSI RTX 2080Ti Trio, Fractal Define S, Seasonic P860, M2 1TB + 2TB SSD
Periferie: 3x AOC AG271QG (1440p 165Hz IPS), Razer Deathadder+Blackadder Chroma, Steelseries QcK+, Sennheiser PC360, DXRACER OH/KF06/NB

Uživatelský avatar
Zakk
Level 3
Level 3
Příspěvky: 480
Registrován: únor 13
Pohlaví: Muž

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 5.5
Level 5.5
Příspěvky: 3092
Registrován: leden 15
Bydliště: Praha / Krkonoše
Pohlaví: Muž

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 :)
https://www.facebook.com/peasantsandcastles/
https://www.twitch.tv/satikcz/
https://www.youtube.com/c/SatikCZE
PC: Intel Core i7 8700K@5GHz+EK KIT L360, ASUS Maximus X HERO, 32GB RAM@3466, MSI RTX 2080Ti Trio, Fractal Define S, Seasonic P860, M2 1TB + 2TB SSD
Periferie: 3x AOC AG271QG (1440p 165Hz IPS), Razer Deathadder+Blackadder Chroma, Steelseries QcK+, Sennheiser PC360, DXRACER OH/KF06/NB

Uživatelský avatar
Zakk
Level 3
Level 3
Příspěvky: 480
Registrován: únor 13
Pohlaví: Muž

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 5.5
Level 5.5
Příspěvky: 3092
Registrován: leden 15
Bydliště: Praha / Krkonoše
Pohlaví: Muž

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 :/
https://www.facebook.com/peasantsandcastles/
https://www.twitch.tv/satikcz/
https://www.youtube.com/c/SatikCZE
PC: Intel Core i7 8700K@5GHz+EK KIT L360, ASUS Maximus X HERO, 32GB RAM@3466, MSI RTX 2080Ti Trio, Fractal Define S, Seasonic P860, M2 1TB + 2TB SSD
Periferie: 3x AOC AG271QG (1440p 165Hz IPS), Razer Deathadder+Blackadder Chroma, Steelseries QcK+, Sennheiser PC360, DXRACER OH/KF06/NB


  • Mohlo by vás zajímat
    Odpovědi
    Zobrazení
    Poslední příspěvek
  • Ovladače na Powercolor X1950GT 256MB, PCI-E (Windows 7 x64)
    od CyberCodeDroid » 24 říj 2018 05:08 » v Problémy s hardwarem
    4
    307
    od CyberCodeDroid
    24 říj 2018 10:39
  • Pomoc
    od Jirka228 » 06 bře 2019 17:46 » v Vše ostatní (inet)
    1
    271
    od ITCrowd
    06 bře 2019 19:42
  • Pomoc
    od Fabregas7 » 17 lis 2018 22:28 » v Design a grafické editory
    7
    1589
    od faraon
    18 lis 2018 07:39
  • Pomoc
    od Faffejt » 11 dub 2019 14:20 » v Programování a tvorba webu
    2
    174
    od Faffejt
    11 dub 2019 15:05
  • prosím o pomoc
    od desirek » 08 zář 2018 12:10 » v Windows 10, 8, 7, Vista, XP…
    10
    794
    od desirek
    15 zář 2018 16:58

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

Kdo je online

Uživatelé prohlížející si toto fórum: CommonCrawl [Bot] a 3 hosti