C 코드와 어셈블리 코드가 있습니다. 조립 된 코드의 3 행 및 6 행을 이해하지 못합니다.조립 된 코드 줄을 이해하고 65535 % edx
C 코드 :
int arith(int x, int y, int z)
{
int t1 = x+y;
int t2 = z*48
int t3= t1& 0xFFFF
int t4 = t2 * t3
return t4;
}
어셈블리 코드 : 65535
우리가 t3 = t1 & 0xFFFF
이 너무 0xFFFF
이되는 방법 6 행에
x at % ebp+8, y at %ebp*12, z at %ebp+16
mol 16(%ebp), %eax
leal (%eax, %eax, 2) % eax
sall $4, %eax
movl 12(%ebp) %edx
addl 8(%ebp) %edx
andl $65535, %edx
imull %edx. $eax
, 이해가 안 돼요.
다른 질문 : 타입 정의하여 선언 num_t이 데이터 형식은 다음과 C의 functino 프로토 타입을 고려해
dest at %ebp+8, x at ebp+12, y at %ebp+16
mov1 12($ebp), $eax
movl 20($ebp), $ecx
imull $eax, $ecx
mull 16(%ebp)
leal (%ecx,%edx), %edx
movl 8(%ebp), %ecx
movl %eax, (%ecx)
movl %edx, 4(%ecx)
:
void store_prod(num_t *dest, unsigned x, num_t y)
{*dest=x*yl}
GCC는 계산의 몸체를 구현 다음 assemblyu 코드를 생성
line movl 20 (% ebp), % ecx 20 (% ebp)의 값이 있습니다. y_t를 잡는 방법은 무엇입니까? 라인 룰 (% ecx, % edx), % edx; edx에는 아무 것도 없나요? 그래서 % ecx에 % edx에 저장하기 위해 추가되는 것은 무엇입니까?
숫자는 같지만 표현이 다릅니다. 0xFFFF는 십진수 65535의 16 진수 표현입니다. –
https://www.google.com/search?q=0xFFFF –
델파이와 같은 일부 언어에서 $는 다음과 같은 16 진수 값을 나타내지 만 GAS 구문 (http : // en.wikibooks.org/wiki/X86_Assembly/GAS_Syntax) 그것은 리터럴 값을 의미합니다. –