홈>
조립 코드 초보자입니다. C ++로 개발할 때 MSVC에서 생성 한 일부 어셈블리 코드를 이해하지 못했습니다. 해당 코드는 다음과 같습니다.
00DA1965 push 4 // The number of bytes we want
00DA1967 call operator new (0DA1339h) // Call to 'new' to allocate memory
00DA196C add esp,4 // Add the 4 bytes to the stack pointer
00DA196F mov dword ptr [ebp-0D4h],eax // Move the return address from EAX into a temporary variable?
00DA1975 mov eax,dword ptr [ebp-0D4h] // Move it back into EAX?
00DA197B mov dword ptr [age],eax // And then into my variable?
해당 C ++ 코드 :
int *age = new int;
올바로 이해하면 EAX의 값을 EBP-0D4h의 임시 변수로 옮깁니다. 그리고 다음 지시에서 우리는 그것을 원래 위치로 다시 옮깁니다.
이점은 무엇입니까? (00DA196F 및 00DA1975)
-
답변 # 1
-
답변 # 2
MSVC가 코드 라인을 분할하고 있습니다 :
int *age = new int;
두 단계로 :
;1st step push 4 ;temp var = new int call operator new add esp,4 mov dword ptr [ebp-0D4h],eax ;2nd step mov eax,dword ptr [ebp-0D4h] ;int *age = temp var mov dword ptr [age],eax
관련 자료
- c++ - 함수는 채우고있는 char 배열보다 큰 cstring을 어떻게 반환 할 수 있습니까?
- javascript - 업데이트 된 항목을 반환하지 않는 배열 맵 함수
- javascript - 부울 값 배열 대신 부울 값 1 개를 반환하는 매핑 함수
- vhdl - 함수에서 제한되지 않은 2D 배열로 레코드를 반환하는 방법
- javascript - 두 번째 JS를 실행하기 전에 하나의 함수가 완료 될 때까지 기다리십시오
- javascript - 요소가 반응하기 전에 문자를 n 번 반환하는 방법
- arrays - PHP 함수에서 한 번에 둘 이상의 값을 반환하는 방법
- python - for 루프없이 함수 내부에서 임의의 동작으로 함수를 n 번 반복하여 numpy 배열 만들기
- sqlalchemy - 돌아온 다음 파이썬에서 다른 함수가 끝날 때까지 기다립니다
- c++ - 하위 시퀀스가 시작되는 첫 번째 반복자를 반환하는 STD 함수
- list - 왜 pop () 함수가 파이썬의 함수 내부에서 값을 반환하지 않습니까?
- recursion - 문자열을 반환하기 위해 Swift에서 재귀 함수를 어떻게 빌드 할 수 있습니까?
- promise - Nodejs 함수 비동기 반환 대기하지 않음
- Swift 함수에서 함수가 루프 내부에 if 문이있는 for 루프를 포함 할 때 왜 'return'이 for 루프 외부에 있어야합니까?
- c - 다른 함수를 호출하고이 함수의 호출자에게 직접 반환하도록합니다
- apache spark - 스칼라에서 varargs를 사용하여 groupBy 함수 만들기
- javascript - Gatsy에서 탐색 기능 정의되지 않음
- reactjs - 함수에 암시 적으로 반환 유형 '모든'오류가 있습니다
- android - Int를 반환하는 함수가 if 문의 일부가 될 수있는 방법은 무엇입니까?
- typescript - 선택적 매개 변수를 기반으로하는 함수 반환 유형
관련 질문
- x86 - 어셈블리 언어 디코딩 (Bomb Lab Phase 5)
- c - 조립 논리 이해 문제
- assembly - 일부 MOV, XOR, RCL 및 DIV 명령어 뒤의 레지스터 값 찾기
- linux - gcc가 분명히 필요하지 않은데 왜 PLT를 생성합니까?
- assembly - "lodsb"및 "inc % si"사용시 이상한 동작
- assembly - xor'ing DS가 허용되지 않는 이유는 무엇입니까? [닫은]
- assembly - Qemu 및 원시 이진 파일
- c - ESP가 [esp + 0xc]를 가리키는 이유는 무엇입니까?
- INTEL x86 어셈블리 코드를 ARM으로 변환하고 싶습니다
- assembly - 8 비트보다 큰 값을 8 비트 레지스터에 저장 한 결과
MSVC의 최적화되지 않은 디버그 빌드 asm 출력은 일반적으로 gcc 또는 clang의 최적화되지 않은 빌드보다 훨씬 더 치명적입니다.
디버그 빌드에서도 스택에 반환 값을 스필/리로드 할 수있는 확실한 이유가 없습니다.: C ++ 추상 머신의 이름을 통해 임시에 액세스 할 수 없으며 디버그 정보가 없습니다. 그것은 당신이
new
의 끝 사이에 그것을 볼 수 있습니다p
의 업데이트 .int*
는 사소하게 복사 가능한 유형이므로 반환 값을 로컬에 복사 할 때 실행할 복사 생성자가 없습니다. 그러나 아마도 이것이 MSVC가하는 이유 일 것입니다.new
를 넣으면 함수 또는 정적 초기화 프로그램 함수 에서이 작업을 수행하지 않습니다. 세계적인 범위에서. https://godbolt.org/z/51SM3N어리석은 브레인 데드 asm을보고 싶지 않으면
-O2
와 같은 최적화를 사용하여 컴파일 또는-Ox
MSVC에서. 그런 다음 예상되는 정적 초기화 프로그램을 얻습니다.x86-64 또는