2017-12-05 8 views
0

새로운 기능은 C 코드에 asm을 사용하므로 내 질문이 너무 바보 인 경우 미안합니다. 문제는 코드 규칙 file.But을 기반으로 텍스트 파일을 코드하는 C에서 프로그램을 작성했습니다. asm.So에서 일부 메소드를 만들려고 시도했는데, asm 파일을 만들기 위해 컴파일러 (비주얼 컴파일러)를 만들었습니다. 것은 한 가지 방법을위한 asm 코드를 보았을 때 이와 같은 것들이있다. 그리고 내 메서드 위에 붙여 넣으려고하면 __asm ​​{} 내부에서 동일한 asm 출력이지만 오류가 발생합니다. 어떻게이 asm 코드를 함수 안에 넣을 수 있습니까? 감사 ...변환 된 C 파일에서 C 언어로 어셈블러 사용

_movement$ = -20          ; size = 4 
_leftBits$ = -16          ; size = 4 
_hexa$ = -12           ; size = 4 
_actualByte$ = -8         ; size = 4 
_character$ = -2          ; size = 1 
_temp$ = -1         ; size = 1 
_data$ = 8           ; size = 4 
_code$ = 12         ; size = 1 
_longg$ = 16           ; size = 4 
_positionBit$ = 20         ; size = 4 
add PROC 
     push  ebp 
     mov  ebp, esp 
     sub  esp, 20    ; 00000014H 
     mov  eax, DWORD PTR _positionBit$[ebp] 
     cdq 
     and  edx, 7 
     add  eax, edx 
     sar  eax, 3 
     mov  DWORD PTR _actualByte$[ebp], eax 
     mov  eax, DWORD PTR _positionBit$[ebp] 
     and  eax, -2147483641 ; 80000007H 
     jns  SHORT [email protected] 
     dec  eax 
     or  eax, -8     ; fffffff8H 
     inc  eax 
[email protected]: 
     mov  DWORD PTR _leftBits$[ebp], eax 
     mov  ecx, DWORD PTR _data$[ebp] 
     add  ecx, DWORD PTR _actualByte$[ebp] 
     mov  dl, BYTE PTR [ecx] 
     mov  BYTE PTR _character$[ebp], dl 
     mov  DWORD PTR _hexa$[ebp], 255 ; 000000ffH 
     mov  eax, 8 
     sub  eax, DWORD PTR _longg$[ebp] 
     mov  DWORD PTR _movement$[ebp], eax 
     mov  edx, DWORD PTR _hexa$[ebp] 
     mov  ecx, DWORD PTR _movement$[ebp] 
     sar  edx, cl 
     mov  DWORD PTR _hexa$[ebp], edx 
     movzx eax, BYTE PTR _code$[ebp] 
     and  eax, DWORD PTR _hexa$[ebp] 
     mov  BYTE PTR _code$[ebp], al 
     mov  cl, BYTE PTR _code$[ebp] 
     mov  BYTE PTR _temp$[ebp], cl 
     mov  edx, 8 
     sub  edx, DWORD PTR _longg$[ebp] 
     add  edx, 1 
     cmp  DWORD PTR _leftBits$[ebp], edx 
     jge  SHORT [email protected] 
     mov  ecx, 8 
     sub  ecx, DWORD PTR _leftBits$[ebp] 
     mov  eax, 255 ; 000000ffH 
     shl  eax, cl 
     mov  ecx, DWORD PTR _data$[ebp] 
     add  ecx, DWORD PTR _actualByte$[ebp] 
     movzx edx, BYTE PTR [ecx] 
     and  edx, eax 
     mov  eax, DWORD PTR _data$[ebp] 
     add  eax, DWORD PTR _actualByte$[ebp] 
     mov  BYTE PTR [eax], dl 
     movzx edx, BYTE PTR _temp$[ebp] 
     mov  ecx, 8 
     sub  ecx, DWORD PTR _longg$[ebp] 
     sub  ecx, DWORD PTR _leftBits$[ebp] 
     shl  edx, cl 
     mov  eax, DWORD PTR _data$[ebp] 
     add  eax, DWORD PTR _actualByte$[ebp] 
     movzx ecx, BYTE PTR [eax] 
     or  ecx, edx 
     mov  edx, DWORD PTR _data$[ebp] 
     add  edx, DWORD PTR _actualByte$[ebp] 
     mov  BYTE PTR [edx], cl 
[email protected]: 
     mov  esp, ebp 
     pop  ebp 
     ret  0 
add ENDP 

컴파일 할 때 오류 로그입니다.

simple.c(185): error C2059: syntax error: '__asm' 
simple.c(201): error C2059: syntax error: 'bad suffix on number' 
simple.c(209): error C2059: syntax error: 'bad suffix on number' 
simple.c(210): error C2018: unknown character '0x40' 
simple.c(214): error C2018: unknown character '0x40' 
simple.c(220): error C2059: syntax error: 'bad suffix on number' 
simple.c(237): error C2018: unknown character '0x40' 
simple.c(240): error C2059: syntax error: 'bad suffix on number' 
simple.c(261): error C2018: unknown character '0x40' 
+0

"오류가 발생했습니다"는 오류가 무엇인지 모르기 때문에 완전히 쓸모가 없습니다. 오류 메시지가 나타나면 정확히 어떤 오류가 발생했는지 알려주고 해당 소스 코드를 표시하십시오. 그렇지 않으면, 당신을 도울 수 없습니다. – fuz

+1

fuz가 말한 것에 덧붙여, 여기서 성취하려는 것을 묻습니다. 코드 실행 속도를 높이려면 목표가 예상보다 훨씬 어려울 수 있습니다. 현대의 C 컴파일러는 수십 년에 걸친 코드 작성을 통해 얻은 엄청난 수의 트릭과 최적화를 사용할 수 있습니다. 어셈블러 목표를 가르치는 것이 목표라면, 가장 어려운 방법을 선택했습니다. 이런 식으로 코드를 작성하는 것이 숙제 프로젝트의 일부라면 선생님은 바보입니다. –

+0

오류를 올바르게 처리하지 못해 죄송합니다. C에 대한 숙제 proyect를 알려 주셨지만, ASM에서 일부 기능을 수행 할 때 어떤 일이 일어나는지 보려고하는 중, 소프트웨어를 더 빠르게 만드는 것은 내 목표가 아닙니다. 컴파일러는 종종이 최적화를 아주 잘 만듭니다. 컴파일 중에 컴파일러가 깨지기 때문에 C 언어의 함수 내에서 출력 asm 코드를 넣을 수 없습니다. – BREAKWAVE

답변

0

어셈블리에 관해서는 거의 알지만 (도움이되는 것은 C/Linux에서 나온 것입니다) 도움이 될만한 것을 제안하려고합니다.

함수에 매개 변수가 전달되어야합니까? 발신자에게 뭔가를 돌려 주어야합니까? 당신은 짧은 C 소스 파일을 작성할 수 있습니다.이 파일은 이와 같은 작은 함수만을 정의합니다.

void butts(void) { 
    printf("butts\n"); 
} 

그런 다음 단일 파일을 어셈블리 방식으로 변환하십시오. 원하는 이름을 지정하고 기억하십시오. 이렇게하면 함수 이름이 butts 인 어셈블러 소스 파일이 제공됩니다. 그런 다음 질문에 게시 한 코드를 해당 어셈블리 파일에 넣을 수 있습니다. 설정 한 이름으로 호출 할 수 있는지 확인하십시오. __asm{}이 원하는대로 작동하지 않을 것이라고 생각합니다.

그런 다음 어셈블리 파일을 개체로 컴파일하고 C- 소스로 컴파일 된 개체와 연결하여 모든 것을 함께 컴파일 할 수 있다고 생각합니다. 함수의 본문을 쓰지 않고이 함수가 C (또는 헤더) 파일에 무엇이든 정의하도록하십시오. 다음과 같은 프로토 타입을 사용하십시오.

void butts(void); 

죄송합니다. 혹시라도 도움이되거나 도움이되지 않는다면 죄송합니다. 브레인 스토밍과 이것만으로도 효과가있을 것입니다.

+0

감사합니다, 그것은 내가 asm에서 더 명확한 기능을 볼 수 있도록 도왔지만, 여전히 몇 가지 문제가 haviong :) – BREAKWAVE