루아 코드를 gcc를 사용하여 C의 인라인 어셈블리로 변환하여 교육용으로 최소한의 루아 컴파일러를 작성했습니다."asm '에서 30 개 이상의 피연산자를 gcc로 인라인으로 assesmbly 사용하는 방법
잠시 후에 생성 된 출력이 C에서 선언 된 변수와 함수에 대한 피연산자가 더 길어지기 시작하면이 오류가 발생하기 시작했습니다.
test.c: In function ‘int main()’:
test.c:100:6: error: more than 30 operands in ‘asm’
);
내가 볼 수있는 유일한 정보를 인터넷 검색을
는 some gcc mailing list from 2008했지만, 그들은 (내가 관심이 아니에요)의 gcc를 재 컴파일을 제외하고 수정이 없었다고 말했다.아이러니하게도 종종 30 피연산자가 없기 때문에이 오류가 발생합니다.
여기
// Standard functions
void io_read(){}
void io_write(){}
void print(){}
int main(){
// Working vars decl
long _t0, _t1, _t2, _t3, _t4, _t5, _t6, _t7, _t8;
long factorial, i, n, x;
// Strings decl
const char* _s0 = "enter a number:";
const char* _s1 = "*number";
const char* _s2 = "factorial of ";
const char* _s3 = " is ";
asm("" // My inline asm code
: // Output symbols
[_s0] "+g" (_s0),
[_s1] "+g" (_s1),
[_s2] "+g" (_s2),
[_s3] "+g" (_s3),
[_t0] "+g" (_t0),
[_t1] "+g" (_t1),
[_t3] "+g" (_t3),
[_t4] "+g" (_t4),
[_t5] "+g" (_t5),
[_t6] "+g" (_t6),
[_t7] "+g" (_t7),
[_t8] "+g" (_t8),
[factorial] "+g" (factorial),
[i] "+g" (i),
[n] "+g" (n),
[x] "+g" (x)
: // Input symbols
[io_read] "r" (io_read),
[io_write] "r" (io_write),
[print] "r" (print)
: // Clobbers
"cc", "rax", "rbx", "rcx", "rdx"
);
}
내 GCC 버전은 사전에 6.2.1 20160830
감사 인 (19 피연산자가 아직도 나에게 그 오류를 제공)을 최소한의 예입니다!
변수를 다시 사용하거나 테이블 (배열)을 만들고이 배열에 오프셋을 사용하여 변수 (컴파일러에서 어셈블리 코드에 삽입 됨)를 가져옵니다. –
인라인 조립품 대신 적절한 조립품을 방출하십시오. gcc는 인라인 어셈블리에 대해 30 개의 피연산자로 제한되며 그 제한을 제거하지 않을 계획입니다. – fuz
C 코드를 생성하는 것이 디버그가 훨씬 쉽고 간단하지 않습니까? 그리고 Assmbler 파일을 직접 생성하지 않으시겠습니까? 불쾌감은 없지만 중급 C 단계는 나에게 헛소리처럼 보입니다. – Olaf