2014-04-21 4 views
0

어떻게 내가 .... 내가 피곤이 방법으로 오프셋 추가 세그먼트 (들) 적절한를 사용하여 2 개 자리 데이터를 저장 할에 ..NASM (64 비트 시스템 호출)

SECTION .data 

offset : db 0100H 

data : db 56H 

SECTION .bss 

.......(initializations not required in this program) 

SECTION .text 

global main 

main : 

mov ax,1000H 

mov es,ax 

mov si,[offset] 

mov al,[data] 

mov es:[si],al 

mov rdi,0 

mov rax,60 

syscall 

이 잘못 무엇입니까? 나는 완전히 새로운 프로그래밍 프로그래밍이다.

+0

16 비트 및 64 비트 x86 어셈블리를 혼합하는 것처럼 보입니다. 그러지 마. 하나를 골라서 전체 프로그램으로 끝내십시오. Intel Software Developer 's Manual의 3.4.2.1 절에 "64 비트 모드에서 : CS, DS, ES, SS는 연결된 세그먼트 디스크립터베이스 의 값에 관계없이 각 세그먼트 기준이 0 인 것처럼 처리됩니다. 코드, 데이터 및 스택을위한 플랫 주소 공간 "_. – Michael

+0

내 64 비트 데이터를 여분의 세그먼트에 저장할 수 있습니까? 플랫 주소 공간에서 허용됩니까? 당신이 클라우드를 어떻게 달성했는지에 대한 예를 들려 주시겠습니까? – user3555940

+0

세그먼트 화 된 메모리 공간이 아니기 때문에 (즉, 64 비트 실행 파일을 빌드한다고 가정 할 때) 평탄한 메모리 공간이 있기 때문에 그렇게하는 것은 의미가 없습니다. 'mov [rsi], al'과 같은 것을 사용하십시오. 이 코드를 살펴보면, 먼저 16 비트 또는 64 비트 어셈블리를 수행할지 여부와 선택한 모드에 대한 자습서를 검색 (및 읽는) 여부를 선택하는 것이 좋습니다. – Michael

답변

0

segent 포인터를 사용하여 특정 메모리 주소에 직접 액세스하는 것은 16 비트 리얼 모드에서만 작동한다. 64 비트 보호 모드에서 실제 메모리 주소는 MMU에 의해 응용 프로그램 표시 주소에 매핑됩니다. 이것은 일반적으로 OS에 의해 관리되는 반면 사용자 공간 응용 프로그램은 OS와 함께 템퍼링을 허용하지 않습니다. 특정 물리적 메모리에 액세스하려면 OS에 메모리 공간에 매핑해야한다고 말할 필요가 있습니다.

관련 문제