저는 어셈블리가 처음이고 메모리에 저장된 문자열을 반복하려고합니다. 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"
인텔은 메모리 접근을위한'[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
당신이 지침을 지키려고하는 것처럼 보입니다. 사람들이 'div % ebx'가 나뉘어 질 것으로 예상하기 때문에 조만간 SO 어셈블리 관련 질문 인 "오버플로 나누기"와 같은 무언가에 빠지게 될 것입니다. eax/ebx, 그렇지 않습니다. 일부 명령어 세트 참조 가이드를 얻고 GAS/AT & T 어셈블리 구문 참조 가이드를 얻으십시오. 그리고 그들을 몇 번 빨리 지나치십시오. (그리고 8086 모드에서의 가능한 메모리 어드레싱 모드는 매우 제한되어 있습니다 ... 또한 'lea string, % edx'는 8086에서 유효하지 않습니다 ...) – Ped7g
@ Ped7g 저는 이것을 지침의 참고 자료로 실제로 사용하고 있습니다. http://flint.cs.yale.edu/cs421/papers/x86-asm/asm.html#registers, 'lw'와 같은 것을 찾을 수 없어서 질문을했습니다. 당신은 맞습니다, 나는 어드레싱 모드를 더 잘 이해할 필요가 있습니다. – Bhargav