2017-09-08 9 views
-1

저는 어셈블리가 처음이고 메모리에 저장된 문자열을 반복하려고합니다. lea (실효 주소로드) 명령을 사용하여 문자열의 주소를 가져올 수 있지만 이제 레지스터에 저장된 해당 주소를 사용하려고합니다.어셈블리의 레지스터에 저장된 메모리 주소의 내용을로드하는 방법은 무엇입니까?

lea string, %edx  ; Load effective address of string into edx 
lw %edx, %eax  ; Load eax with the value stored where edx points 

... 
string: 
    .string "Hello" 
+1

인텔은 메모리 접근을위한'[address]'문법을 가지고 있으며, 거의 모든 기본 명령어에 적용 할 수 있습니다. 단지 값을 가져 오는 것뿐 아니라 기본적인 산술 연산도 가능합니다. 그러나 gas/AT & T 문법을 사용하는 경우 메모리 참조는 'offset (r_base, r_index, index_scale_factor)'이고 offset과 index_scale_factor는 숫자 (또는 기호)입니다. 그래서'mov eax, [edx]; 문자열'='movl (% edx), % eax'의 처음 4 문자를로드하고,'mov al, [arrayX + edi * 8 + esi]'='movb arrayX (% esi, % edi, 8), % al' – Ped7g

+0

당신이 지침을 지키려고하는 것처럼 보입니다. 사람들이 'div % ebx'가 나뉘어 질 것으로 예상하기 때문에 조만간 SO 어셈블리 관련 질문 인 "오버플로 나누기"와 같은 무언가에 빠지게 될 것입니다. eax/ebx, 그렇지 않습니다. 일부 명령어 세트 참조 가이드를 얻고 GAS/AT & T 어셈블리 구문 참조 가이드를 얻으십시오. 그리고 그들을 몇 번 빨리 지나치십시오. (그리고 8086 모드에서의 가능한 메모리 어드레싱 모드는 매우 제한되어 있습니다 ... 또한 'lea string, % edx'는 8086에서 유효하지 않습니다 ...) – Ped7g

+0

@ Ped7g 저는 이것을 지침의 참고 자료로 실제로 사용하고 있습니다. http://flint.cs.yale.edu/cs421/papers/x86-asm/asm.html#registers, 'lw'와 같은 것을 찾을 수 없어서 질문을했습니다. 당신은 맞습니다, 나는 어드레싱 모드를 더 잘 이해할 필요가 있습니다. – Bhargav

답변

1

"MOV"당신은 간접 중 모드에 따라 일부 레지스터 제한이있는 (주소와, 무엇을 찾고 있는지 당신 '

로 사용될 수 lw에 아날로그가 다음과인가 in)

+0

예를 들어 주시겠습니까? 나는'mov % edx, % eax'를하려고 할 때 뭔가 잘못하고있는 것 같아요. 그 이유는 내용이 많아서 eax에 큰 숫자가 들어가기 때문이며 메모리 주소의 내용은 움직이지 않기 때문입니다. – Bhargav

+0

맞습니다. 간접적 인 주소 지정을 사용하지 않으셔도됩니다. AT & T 구문에서이를 수행하는 방법을 찾아야합니다. 나는 본질적으로 AT & T 문법에 대해서만 읽기 전용이다. 열정으로 싫어서 인텔 구문을 MOV EAX, [EDX] –