2016-09-05 1 views
-2

어셈블리가 처음입니다. 간단히 말해서 나는 내가하고있는 일과 그 일이 왜 그런 식으로 반응 하는지를 모른다. 나는 nasm을 사용하고 있지만 어떤 c 함수도 사용할 수 없습니다. 이것은 Intel x86 64bit 용 nasm 어셈블리를 사용하여 공동으로 컴파일하고 실행합니다. 여기에 몇 가지 코드가 있습니다 :NASM이 메모리에서 레지스터로 이동하고 예상대로 돌아 가지 않음

section .data 

    x: dd 0 

section .text 
    global _start 

_start: 
    mov eax,0 
    mov edi,0 
    mov rsi,x 
    mov edx,1 
    syscall 

    mov r9,x ;My problem was here, should be mov r9,[x] 
    mov word [x],r9w 

    mov eax,1 
    mov edi,1 
    mov rsi,x 
    mov edx,1 
    syscall 

    mov eax,1   ; The system call for exit (sys_exit) 
    mov ebx,0   ; Exit with return code of 0 (no error) 
    int 80h; 

그래서 제가 여기에서하고있는 것은 콘솔에서 입력을 읽고 x로 저장하는 것입니다. r9를 등록한 다음 x로 다시 이동하십시오.

input 5 

.

output 

정상적인 xor 및 mov r9,0을 시도했습니다. 나는 그것이 나에게이 시도하고 이것이 어떻게 작동하는지에 대한 깊은 이해를 얻을 것입니다 수행하기위한

U 

내 유일한 목표의 출력을 제공, 그것은 내가 200을 추가하면 값 엉덩이를 얻을 수 있습니다 않는 것을 볼 수 있습니다. 고맙습니다.

+0

디버거에서 코드를 한 단계 건너 뛰십시오. 그 점이 당신의 이해를 도울 것입니다. 당신은'x'의 하위 16 비트를'x'에 저장하고 있습니다. IDK가 왜 그런 짓을하는지. –

+0

x 내의 값을 x에 저장하려고합니다. 이해 이외의 이유가 없다. 임무를 수행하는 동안 나는 결과물에서 불규칙 함을 발견했다. 나는 레지스터들과 memmory에서왔다 갔다하는 문제로 그것을 끓였다. – Elterado

+1

[NASM은 메모리 참조를 위해 대괄호가 필요하다] (http://www.nasm.us/doc/nasmdoc2.html#section-2.2.2) – Michael

답변

0
나는 그래서

당신이 X의 값을로드 한 후 수정되지 않은 다시 보관하려는 X에서 X 내에서 값을 저장하려고

?

IDK "x의 값"이 인 경우x 레이블이 표시된 메모리 주소에 저장되어 있음을 이해하십시오.


어쨌든, 또한 ( dd으로) 주소 x에서 4 바이트를 예약했습니다 있습니다. 이 주소를 sys_read(0, x, 1)으로 전달하면 커널이 stdin에서 최대 1 바이트의 입력을 저장할 수 있습니다.

그러면 의 주소를 mov r9, x으로 R9에 넣습니다. (I는 8 바이트로드 될 mov rsi, [x]을 수행하는 것을 의미 생각한다.) 그런

는 [X]를 선택한

추월 r9w MOV '와 X에 R9의 하위 16 비트를 저장할 sys_write에 x의 주소, stdout에 1 바이트 쓰기.

IDK는 여기에서 목표로하고 싶은 것을 IDK에서 제공하지만 코드가 실제로하는 일을 설명하는 데 도움이 될 수 있습니다.

자세히 알아 보려면 (gdb와 같은) 디버거에서 단일 단계를 수행하고 감시 레지스터 값을으로 변경하십시오. 태그 위키의 하단에있는 gdb 사용법 참고 사항을 참조하십시오.

+0

의 반환 값을 가진 종료 시스템 호출입니다. 예, 감사합니다. 나는 내 코드로 무엇을 성취하려고 시도하지 않고, 내가하는 일을 이해하기 위해 노력했다. 문제는 []를 사용할 때입니다. 내 목표는 내 코드에서 내 문제를 뽑아 내 전체 과제보다는 여기에 게시하는 것이 었습니다. – Elterado

+1

나는 그의 질문의 제목이 그 질문 자체보다 더 잘 어울린다고 생각한다. 나는 그의 목표에 따라 기억을 추후에 등록하고 되돌아 오는 것이라고 생각한다. –

+0

@ 엘테 탈도 : 일반적으로 질문에 대한 답을 편집해서는 안된다. 문제가 무엇인지 알게되면 자주 되돌아 가서 질문을보다 명확하게 개선 할 수 있지만 답변은 여전히 ​​답변에 속합니다. 문제는 여전히 혼란스러운 혼란으로 읽습니다. IDK는'input 5' 코드 블록이 무엇을 해야하는지, 그리고 질문에 squinting 몇 분이 걸렸다. 백틱을 사용하여 문장에서 인라인으로 코드 형식을 얻을 수 있습니다 (BTW). –

관련 문제