2017-11-29 16 views
0

nasm x86 어셈블러에서 []를 사용하여 주소를 조작하는 방법을 알고 싶습니다.nasm x86 어셈블리 언어에서이 구문의 의미는 무엇입니까 (MOV [EBX], 110)?

MY_TABLE TIMES 10 DW 0 ; Allocates 10 words (2 bytes) each initialized to 0 
MOV EBX, [MY_TABLE]  ; Effective Address of MY_TABLE in EBX 
MOV [EBX], 110   ; MY_TABLE[0] = 110 
ADD EBX, 2    ; EBX = EBX +2 
MOV [EBX], 123   ; MY_TABLE[1] = 123 

의 MOV EBX, [MY_TABLE] - 여기 EBX에 복사 EBX 레지스터 또는 MY_TABLE의 주소로 복사 MY_TABLE 값 레지스터? []

MOV [EBX], 110 내부에 지정된 주소에 값을 제공하기 때문에 나는이 질문입니다 - 여기 무슨 일이 내가 구문을 이해할 수 없다!

+1

EBX가 가리키는 주소로 110을 이동하십시오. 크기가 불분명하지만 NASM이 코드가 유효한 NASM 코드가 아닌 기본 설정을 가지고 있지 않다면 (어떤 좋은 어셈블러도 그렇듯이) NASM은이 경우 명백한 피연산자 크기를 요구합니다. –

+0

크기를 알 수 있지만 (MY_TABLE은 단어 크기로 "정의"되어 있음) 여전히 경고가 표시되어야합니다. 'MOV [EBX], 110 '은 모호합니다. 이 경우 어셈블러는 무엇을합니까? – Tommylee2k

+1

line2의 주석이 잘못되었습니다. 실효 주소를로드하려면, LEA (로드 실효 주소)가 올 바릅니다. (또는'MOV EBX, offset My_table' 사용). 이것은 주소 my_table의 내용을 EBX (첫 번째 TWO 값, ebx는 32 비트이고, my_table은 16 바이트 값을 가짐)로 이동합니다. – Tommylee2k

답변

0

당신이 nasm 문서에게 특히 장 3.3 - Effective address을 선택하면 당신은 읽을 것이

mov EBX,[MY_TABLE] 

로드 EBX에 유효 주소를 입력합니다. 나중에 값 110과 123을 요소 (인덱스 0과 1)에 넣을 수 있습니다. , NASM과

mov word [EBX], 110 
... 
mov word [EBX], 123 
+1

mov EBX, [MY_TABLE]'move 주소가 아닌 My_table에 저장된 콘텐츠. LEA가 주소를로드하거나 'mov EBX, offset MY_TABLE' – Tommylee2k

+0

일반적으로 동의합니다.하지만'nasm'에 바로 가기가 있다고 생각합니다 : "NASM의 유효 주소는 매우 간단한 구문을 가지고 있습니다 : 그들은 표현식으로 구성됩니다 원하는 주소로 평가하고 대괄호로 묶습니다. " –

+0

@ Pawel Lukasik, mov EBX, [MY_TABLE]. MY_TABLE의 유효 주소를로드하거나 MY_TABLE이 가리키는 메모리 내용을로드합니다. –

3

다운로드 마지막으로 패키지를 엽니 다, 당신은 짧은 포함 파일 'nasm.txt'를 가지고 : 코멘트에 언급하지만, 당신은 같이 가야 피연산자의 크기를 누락 Nasm 사용에 대한 참조. 대괄호를 사용하지 않는 한이 파일이 경우 메모리 위치의 내용 은,

'기호 참조는'항상 즉각적으로 이해하고있는 다음 문장 (예 : 주소 심볼의 )입니다 익숙한. 따라서 :

mov ax,[wordvar] 
mov ax,[wordvar+1] 
mov ax,[es:wordvar+bx] 

반면 모든 변수 wordvar의 주소

mov ax,wordvar 

로드 AX, 메모리 위치의 '내용'을 참조.

+0

포인터로 레지스터를 사용할 때 (oldfashion이 보이는 것처럼 인정합니다.) 'mov ax, wordvar' 대신에 ('mov ax, offset wordvar' 대신에 --imo와 종종 혼동됩니다.) 아주 끔찍한 - MASM 구문). 오프셋은 내용이 아니라 주소라는 것을 분명히합니다. – Tommylee2k

+0

@ Tommylee2k : NASM에서 그렇게하려면 빈 문자열에'% define OFFSET'을해야합니다. NASM 키워드가 아니기 때문입니다. 그것은 나쁜 생각은 아닙니다. 특히 MASM이나 GNU'.intel_syntax'를 사용하는 경우가 있습니다. –