ucinany adres liniowy w nasm

0

nasm nie kompiluje prawidłowo prostego kodu źródłowego :(

[BITS 64]	; 64 bitowy kod
[ORG 0x0000000100000000]	; adres logiczny kodu programu

start:
	mov	ax,	ss
	mov	ds,	ax
	mov	es,	ax

	mov	rsi,	text_start_from_new_line



adres 0x100000378 - etykieta text_start_from_new_line



[akasei@localhost wataha]$ nasm -f bin shell.asm -o shell.bin
[akasei@localhost wataha]$ ndisasm shell.bin 
00000000  668CD0            mov eax,ss		<- ?!?!?!
00000003  8ED8              mov ds,ax
00000005  8EC0              mov es,ax
00000007  48                dec ax		<- ?!?!?!
00000008  BE7803            mov si,0x378	<- ?!?!?!
0

kompilujesz na 64 bity a dezasemblujesz jakby to było 32 16

0

problem już rozwiązałem dyrektywą[DEFAULT REL]
dzięki temu wszystkie adresy są relatywne, a nie absolutne - co nie działa w trybie 64 bitowym
działo się tak, że mając polecenie:

mov rcx, etykieta

nasm przerabiał to na

mov ecx, dword etykieta

obcinał starszą część rejestru rcx gdzie były cenne informacje
po przełączeniu na obliczanie adresów relatywnie wszystko działa poprawnie i nasm już przerabia na

mov rcx, qword rip+374 ; etykieta

lub

mov rcx, qword rip-126 ; etykieta_2
0

problem nie istniał; problem stworzyłeś asemblując kod jako 64-bitowy a dezasemblując tak jakby to był 16-bitowy.
zdecyduj się po prostu, jaki ma być.

0
Azarien napisał(a):

problem nie istniał; problem stworzyłeś asemblując kod jako 64-bitowy a dezasemblując tak jakby to był 16-bitowy.
zdecyduj się po prostu, jaki ma być.

problem istniał :D mogę pokazać raz jeszcze, po prostu zły dałem przykład (moja nieuwaga)

1 użytkowników online, w tym zalogowanych: 0, gości: 1