C 코드에 어셈블리를 넣는 기법을 쓴 코드입니다.
예전부터 배우고 싶었지만 어셈블리를 잘 모르기에 배우지 못했습니다.
하지만 이번 기회에 배우게 되어 정말 다행입니다.^^
3.39
Use the asm statement to implement a function with the following prototype:
void full_umul(unsigned x, unsigned y, unsigned dest[]);
This function should compute the full 64-bit product of its arguments and
store the results in the destination array,
with dest[0] having the low-order 4 bytes
and dest[1] having the high-order 4 bytes.
/*
* full_umul function
*
* Compute the full 64-bit product of its arguments and store the results in the destination array.
* dest = x * y, dest[0] : low-order 4 bytes, dest[1] : high-order 4 bytes.
*
* Assembly operation mull multiply 32 bit number.
* "mull S"'s Effect is R[%edx]:R[%eax] <- S * R[%eax]. It's Unsigned full multiply.
* So I use this operation using Embedding Assembly Code in C Program.
*
* 2008.06.04
* Bak Jin Yeong
*
*/
void full_umul(unsigned x, unsigned y, unsigned dest[])
{
asm("movl %0, %%eax;" /* eax <= x; operation. mull S is S * %eax.*/
"mull %1;" /* mull S calculate S * %eax into %edx, %eax*/
"movl %%eax, (%2);" /* *dest = %eax; %eax has low-order 4 bytes.(32bits)*/
"movl %%edx, 4(%2);" /* *dest + 1 = %edx; %edx has high-order 4 bytes.(32bits)*/
: /* no output */
: "r" (x), "r" (y), "r" (dest) /* input - x : %0, y : %1, dest : %2*/
: "%eax", "%edx"); /* Overwrites register : %eax, %edx*/
}
- 2008년 1학기 데이터통신 - Checksum (0)2008/06/21
- 2008년 1학기 공학컴퓨터프로그래밍 - MATLAB why... (0)2008/06/21
- 2008년 1학기 공학수학1 - Stability Criteria fo... (0)2008/06/21
- 2008년 1학기 시스템 프로그래밍 - Embedding Ass... (4)2008/06/09
- 2008년 1학기 시스템 프로그래밍 - sm2tc (0)2008/04/16
- 2008년 1학기 시스템 프로그래밍 - bitCount (0)2008/04/16
- 2008년 1학기 시스템 프로그래밍 - sum3 (1)2008/04/16
글에 잘못된 점, 다른 점, 부족한 점이 있다면 지적해주세요.
댓글, 트랙백, 메일 모두 고맙습니다.







댓글을 달아 주세요
어릴적 프로그래밍을 모를때 이유 없이 어셈블리가 제 로망이었습니다..만,
지금은 코딩중 오류등으로 인해 표준함수의 어셈블코드가 나타나면 절망.
음, 그래도 여전히 기회가 닿으면 저도 배우고 싶습니다.
바라는걸 배우시게 된것, 축하드립니다 ^^
저도 어셈블리가 로망 중 하나였습니다.
(그 전에 C가 로망이었죠. 친구 왈 해커는 C를 알아야 한다는 말에...)
이제는 어느 정도 어셈블리 코드를 읽을 수 있지 않나 싶지만, 잘 모르겠습니다.^^;;;
축하 고맙습니다.ㅜㅜ
모 memcpy, memmove는 전체가 다 어셈으로 짜여있긴 합니다만, 요즘처럼 컴파일러가 똑똑한 세상에는 인라인 어셈블리는 그다지... 주로 인라인 어셈을 쓴다면 SSEx 시리즈를 이용한 SIMD 프로그래밍인데 이럴 땐 asm으로 넣기 보다는 intrinsics를 쓰는 것이 더 좋아요. intrinsics의 장점은 레지스터 얼로케이션 같은 건 컴파일러가 하도록 남기기 때문에 최적화의 여지를 더 두죠. 일반적으로 레지스터 할당 같은 건 컴파일러가 사람보다 더 똑똑히 합니다.
사실 그게 저도 의문이었습니다만, 위의 함수를 보니 어느 정도 이해는 되었습니다.
저걸 C로 짤 생각을 하니 조금 머리가 아프더라구요.
그런데 어셈으로는 mull 명령어만 호출하면 되니...^^;;;
intrinsics라는 것이 있군요.
후에 찾아 공부해야겠습니다.
좋은 정보 고맙습니다.^^ㅜㅜ