2016-10-11 2 views
0

어셈블리 언어의 특정 부분을 가르치는 중이고 지금은 데이터 선언을 주소에 저장하는 데 집중하고 있습니다.주소에 dword 저장

16 진수를 저장할 때는 바이트를 처리하는 경우를 예로 들겠습니다.

1234 

나는 이런 식으로 저장할 수 있습니다 : dword 값이 32 비트이기 때문에

Address 0000 - 12 
Address 0001 - 24 

, 나는 각각 두 배 많은 공간을 차지한다고 가정하고있다.

내가 DWORD이로 끝날 경우 :

54 00 87 D1 49 5A AF 56 32 

그들이 다음과 같이 저장됩니다 :

Address 0000 - 54 
Address 0002 - 00 
Address 0004 - 87 
Address 0006 - D1 
Address 0008 - 49 
Address 000A - 5A 
Address 000C - AF 
Address 000F - 56 
Address 0011 - 32 

?

+1

왜 DWORD 예에 9 바이트가 있습니까? 어쨌든, [endianness] (https://en.wikipedia.org/wiki/Endianness)에 대한 귀하의 질문은 무엇입니까? –

+0

@MargaretBloom 나는 나머지가 0으로 채워지려고했다. (그렇지 않다면). 그리고 네, 리틀 엔디안을 사용한다면 32 비트 임에도 불구하고 프로 시저가 동일합니까? [이 사이트] (http : //www.c-jump.co.kr/CIS77/ASM/DataTypes/T77_0060_big_little_endian.htm)은 그것이하는 것을 암시하며, 내가 무엇을 다루고 있더라도 그 단계는 동일하다고 말할 것입니다. 나는 검증을 찾고 있다고 생각한다. – Frog6666

+0

멀티 바이트 값 (워드, 워드 등)을 저장할 때 리틀 엔디안을 사용하면 어림짐작은 "로우 바이트에서 로우 바이트"입니다. 여기서 "로우 바이트"는 최하위 바이트를 의미합니다. 첫 번째 예제에서 WORD 1234h는 BE에 저장되고 두 번째 예제는 엔디안이없는 바이트를 저장하기 때문에 질문에 혼란 스럽습니다. –

답변

1

지적했듯이 값은 dword를 초과합니다.

x86의 경우 8086이 16 비트 마이크로 프로세서이기 때문에 "단어"는 16 비트입니다. 이 문맥에서 "2 바이트"를 의미합니다. "더블 워드"는 2 워드 또는 4 바이트이고 "쿼드 워드"는 4 워드 또는 8 바이트입니다. x86은 "리틀 엔디 언 (little endian)"프로세서이므로 레지스터 끝에 작은 부분부터 메모리에 쓰기 시작합니다.

당신이 뭔가를 할 경우 (인텔 구문과 GCC 스타일의 진수 숫자) : 다음

#Load the lowest 8 bits of the rax register (al) with 0x54 
#This is loading a BYTE (1 byte) 
mov al,0x54 
#Load the lowest 16 bits of the rbx register (bx) with 0x5400 
#This is loading a WORD (2 bytes) 
mov bx,0x5400 
#Load the lowest 32 bits of the rcx register (ecx) with 0x540087D1 
#This is loading a DWORD (4 bytes) 
mov ecx,0x540087D1 
#Load the entire 64 bit register rdx with 0x540087D1495AAF56 
#This is loading a QWORD (8 bytes) 
mov rdx,0x540087D1495AAF56 

당신이 레지스터 RSI에서 개최 된 주소로이 이동한다면, 당신은 얻을 것이다 :

#Put the value of al (0x54) into address at [rsi+0] 
mov [rsi],al 
#Put the value of bx (0x5400) starting at the address at rsi+0, 
# such that [rsi+0] will be 0x00 and [rsi+1] will be 0x54 
mov [rsi],bx 
#Put the value of ecx (0x540087D1) starting at the address of rsi+0, 
# such that [rsi+0] will be 0xD1, [rsi+1] will be 0x87, 
# [rsi+3] will be 0x00, and [rsi+4] will be 0x54 
mov [rsi],ecx 
#Put the value of rdx (0x540087D1495AAF56) starting at the address of rsi+0, 
#such that [rsi++0] will be 0x56, [rsi+1] will be 0xAF, 
# [rsi+2] will be 0x5A, [rsi+3] will be 0x49, 
# [rsi+4] will be 0xD1, [rsi+5] will be 0x87, 
# [rsi+6] will be 0x00, and [rsi+7] will be 0x54 
mov [rsi],rdx 

예제 값은 9 바이트로 레지스터에 들어 가지 않으며 시스템 유형이 아닙니다. (예 : 86로, 리틀 엔디안)

0x540087D1 :

그래서 더블 워드에 대한 결과 램과 같을 것이다
먼저 어드레싱 0xD1
둘째 어드레싱에는 0x87
셋째 어드레싱 × 00
(예 : SPARC과 같은 빅 엔디안) 넷째 어드레싱 0x54

:
먼저 어드레싱 0x54
두 번째 어드레싱 × 00
셋째 어드레싱이에는 0x87
넷째 어드레싱 0xD1

나 또한 미래의 조립 질문에 그것을 추가 할 것입니다, 당신은 항상 거의 일반적인 조립 질문이 없습니다 질문 -의 구조를 논의해야합니다.