1) far call
16비트 CPU 시절에는 메모리 주소를 지정할때 SEGMENT:OFFSET 구조를 사용했었습니다.
FAR CALL 은 SEGMENT가 다른것을 의미합니다.
NEAR CALL은 OFFSET만 있어도 되지만
FAR CALL 은 SEGMENT, OFFSET 이 있어야 되겠죠.
참고로 32비트 시대에는 메모리가 LINEAR 해서 FAR CALL 같은 개념은 없습니다.
그냥 OFFSET 만 존재하는게 32비트 CPU죠.
2) imm16, imm32
imm이 immediate 를 의미하는걸로 기억합니다.
그냥 숫자 데이터라는 의미입니다.
16, 32는 비트수 입니다.
1. far call
16비트의 경우에는 simpid님이 잘 설명해 주셨으니 참고하시고요. 32비트 환경에서는 segment 대신
selector의 개념이 나타나게 되므로 지정한 selector에 대한 segment descriptor를 참조하여 호출이
일어납니다. 일반적으로 현재의 운영체제에서 flat memory model을 사용하므로 far call을 일반 응용
프로그램에서 사용하는 예는 없으며 사용할 경우 priviledge level의 문제로 exception이 발생할 수
있습니다. 운영체제에서는 far call을 사용할 수 있습니다. (자세한 내용은 intel의 data sheet를
참조하시기 바랍니다)
2. ret imm16 or imm32
ret 뒤에 붙는 immediate 값은 해당 숫자 만큼 스택을 비우는 용도입니다. 호출전에 사용한 parameter
가 stack에 push 되어 있을 것이므로 이 값을 ret 명령의 수행 이후에 비우는 것입니다. 일반적으로
pascal 호출 규약이나 윈도우즈의 stdapi 호출 규약에서 사용됩니다. (c 언어의 호출 규약에서는 호출
한 쪽에서 스택을 비우도록 되어 있으므로 이 형태의 어셈블리 코드를 발견할 수 없습니다)
x86 어셈블리
10년전쯤에 x86 어셈블러 열심히 썼었는데...
안쓴지 오래되서 잘 기억은 안나는군요.
1) far call
16비트 CPU 시절에는 메모리 주소를 지정할때 SEGMENT:OFFSET 구조를 사용했었습니다.
FAR CALL 은 SEGMENT가 다른것을 의미합니다.
NEAR CALL은 OFFSET만 있어도 되지만
FAR CALL 은 SEGMENT, OFFSET 이 있어야 되겠죠.
참고로 32비트 시대에는 메모리가 LINEAR 해서 FAR CALL 같은 개념은 없습니다.
그냥 OFFSET 만 존재하는게 32비트 CPU죠.
2) imm16, imm32
imm이 immediate 를 의미하는걸로 기억합니다.
그냥 숫자 데이터라는 의미입니다.
16, 32는 비트수 입니다.
...
1. far call
16비트의 경우에는 simpid님이 잘 설명해 주셨으니 참고하시고요. 32비트 환경에서는 segment 대신
selector의 개념이 나타나게 되므로 지정한 selector에 대한 segment descriptor를 참조하여 호출이
일어납니다. 일반적으로 현재의 운영체제에서 flat memory model을 사용하므로 far call을 일반 응용
프로그램에서 사용하는 예는 없으며 사용할 경우 priviledge level의 문제로 exception이 발생할 수
있습니다. 운영체제에서는 far call을 사용할 수 있습니다. (자세한 내용은 intel의 data sheet를
참조하시기 바랍니다)
2. ret imm16 or imm32
ret 뒤에 붙는 immediate 값은 해당 숫자 만큼 스택을 비우는 용도입니다. 호출전에 사용한 parameter
가 stack에 push 되어 있을 것이므로 이 값을 ret 명령의 수행 이후에 비우는 것입니다. 일반적으로
pascal 호출 규약이나 윈도우즈의 stdapi 호출 규약에서 사용됩니다. (c 언어의 호출 규약에서는 호출
한 쪽에서 스택을 비우도록 되어 있으므로 이 형태의 어셈블리 코드를 발견할 수 없습니다)
댓글 달기