2013-02-19 3 views
2

이 줄은 나에게 매우 명확하지 않다의 의미를 확인하십시오 (나는 총회에 아주 새로운 해요).AT & T 조립 라인

eax = foo&0x800000ff; 

내가 조립 라인을 참조를 본 적이 : 이해 foo 대신 0xffffffff(%edx,%ebx,1)으로 사용하는 간단한 예제에서는이 (이 옳다고 전혀 확인, 단지 관련 항목을 검색하지 않음) 할 수 -1 (0xffffffff), 정확히 어디에서 오는 정보입니까 %eax? 이 저장된다 뭐든 :

[%edx + %ebx -1] 
+0

Eek! 어셈블러! –

+0

가능한 중복 [x86 명령 의미] (http://stackoverflow.com/questions/12327408/x86-instruction-meaning) –

+0

보 Persson, 어떻게 그것을 복제입니까? – asimes

답변

6
movsbl <%x, %y, 1>, %z 

말한다는, 첫 번째 피연산자에 의해 어드레싱 된 메모리 위치에서 하나의 바이트를 판독하는 단계 (X), 32 비트 바이트를 연장하고 (레지스터에 그 결과를 저장할 지).

< % x, % y, 1>은 x와 y의 값을 더한 메모리 주소입니다. 1은 y에 적용되는 승수입니다.

+0

바이트가 32 비트로 확장되었을 때 어떤 일이 일어나는지 설명해 주시겠습니까? 가장 중요한 3 바이트를 0으로 채 웁니까? 나는 다른 설명에서 "부호 확장"을 보았습니다. 나는 0x800000ff를 쓰는 것에 의해 그것이 틀렸는가/틀린가를 보여 주려고 노력 했는가? – asimes

+0

확장 = 바이트에서 길이로 확장하십시오. Intel 구문에서이 명령어의 니모닉은 MOVSX입니다. C 컴파일러는 int8_t 유형의 변수를 int로 변환해야 할 때이 명령을 사용할 수 있습니다.이 값은 산술 및 정수 승격과 같은 몇 가지 다른 연산에서 자동으로 발생합니다. 명령어는 대상 레지스터의 모든 32 비트 (또는 무엇이든)에 쓰기 만하면 레지스터의 하위 8 비트에만 쓰는 결과로 발생할 수있는 성능 저하를 방지합니다. –

+0

내가 의미하는 바는 3 개의 가장 중요한 바이트에 들어간 것입니다. 가장 중요한 바이트가 복사 된 바이트라고 가정하지만 다른 것들은 어떻습니까? 그들은 모두 0일까요? – asimes

0

당신이 C에 쓰기 원하는 경우, 선은 유사 뭔가 될 것이다 :

:

#include <stdlib.h> 

int loadByte(char *base, size_t index) 
{ 
    return (int)base[index - 1]; 
} 

이 (UN * X에, 64 비트 x86 용) 다음과 같은 오브젝트 코드의 결과를 컴파일

Disassembly of section .text: 

0000000000000000 : 
    0: 0f be 44 37 ff   movsbl 0xffffffffffffffff(%rdi,%rsi,1),%eax 
    5: c3      retq 

는 이전에 movsb이동 (부하) 바이트, 사인은 ...에 확장을 의미했다 (그래서 단어/short, 장기로의 전환을위한 movsbw, movsblmovsbq이 있습니다/int 및 쿼드/long long).

어셈블리는 32 비트 용입니다 (주소 지정에 사용되는 레지스터가 32 비트이기 때문에). 그렇지 않으면 의미가 같습니다.