2014-11-27 1 views
2

모두 x86_64 어셈블리에 어려움이 있습니다. file create. x86에서 파일 만들기가 정상적으로 작동합니다. 0644 octal -rw-r--r-- 파일 권한의 8 진수 권한을 가진 파일의 생성 예를 들어, x86에서, 모드 (__NR_creat 8)에 대한 호출은 0420 결과 :Linux asm x86_64 파일 만들기 (__NR_creat 85), 파일 생성 없음

mov  eax, 8    ; system call number (sys_creat) 
mov  ebx, [fnbuf]  ; set ebx to filename 
mov  ecx, 0420   ; 644 octal -rw-r--r-- 
int  0x80    ; call kernel 

동안 asm-x86/unistd_64.h85 변경하고 커널 호출 규칙에서 시스템 콜 번호 x86_64에서 (%rdi, %rsi, %rdx, %r10, %r8 and %r9) x86_64 ABI (A.2.1 Calling Convention)으로 추적하면 x86_64에서 동일하게 작동하는 파일 생성이 필요합니다. 코드 변경하고, 통화가 될 것입니다 :

mov  rax, 85    ; __NR_creat x86_64 syscall 
mov  rdi, [ofname]  ; filename in rdi 
mov  rsi, 0420   ; 644 octal -rw-r--r-- 
syscall      ; call kernel 

그러나, 파일이 생성되지 않습니다. x86과 x86_64 사이에 다른 점이 있습니까? 어떤 도움을 주시면 감사하겠습니다. 나는이 문제에서 찾을 수있는 모든 참조를 거쳤으며 x86_64 sys_creat 차이점에 대한 추가 정보를 찾을 수 없습니다. 최소 유효성을 검사 할 수있는 예가 여기에 있습니다 : filecreat_64.asm. nasm 컴파일 및 링크는 다음과 같습니다

nasm -f elf64 -o filecreat_64.o filecreat_64.asm 
ld -o filecreat_64 filecreat_64.o 

답변

2

당신은 당신이 파일 이름의 주소를 통과해야하기 때문에 mov rdi, ofname (. 즉, 어떤 괄호)를 사용하지합니다. 덧붙여 말하면, 그것은 32 비트에서도 동일해야합니다.

추신 : 디버거를 사용하는 방법을 배우고 strace

+0

감사합니다. 나는 strace를 제외한 모든 것을 사용했다. 짧은'fopen' 예제를 역 컴파일하기 위해'gdb'를 사용했지만, asm 파일을 실행하지 않았습니다. 나는 x86을 사용했는데 설명 할 수없는 이유 때문에 작동했습니다. 다시 한번 감사드립니다. 내가 몇 시간 동안 봤어야 할 나무 문제에 대한 포레스트 였어. –