어셈블리어에서 offset 명령어를 붙였을 때의 차이가 무엇이죠?
글쓴이: hiluciano / 작성시간: 수, 2014/10/22 - 12:42오후
; 생략
.data
message db "Hello, World!", 0Dh, 0Ah, 00h
range dd 0, 99 ; 최솟값 0, 최댓값 99
.code
; 생략
push offset message
call printf ; C 함수 printf 호출
add esp, 4
mov eax, 5
bound eax, range ; eax의 값이 0 이상 99 이하가 아니면 인터럽트
printf를 호출하기 위해 message의 메모리 번지를 스택에 넣을 때는 offset 명령어를 사용하는데
왜 bound 명령을 사용할 때는 offset을 쓰지 않는 것일까요?
Forums:
문자열과 정수값 위치 참조에 대한 차이라 생각합니다.
'
답변 감사합니다
그런데 bound 명령어도 두 번째 오퍼랜드에서 메모리의 주소를 받습니다.
인텔에서 배포하는 x86 명령어 레퍼런스를 보면
bound r16, m16&16
bound r32, m32&32
이렇게 오퍼랜드를 받는다고 되어 있길래
bound eax, offset range 와 같이 정수 배열인 range의 주소를 지정하니까
masm에서 invalid instruction이라고 구문 오류가 뜹니다.
offset을 지우고 제시한 예와같이 배열의 이름만 지정하니까 제대로 작동하고요
둘 다 메모리 주소인 것 같은데 왜 printf 호출을 위해 스택에 푸쉬할 때는 오프셋 키워드를 넣고
bound를 쓸 때는 그냥 배열 이름만 적는지 모르겠네요
댓글 달기