2014-05-12 3 views
1

Code :: Blocks에서 GNU GCC 컴파일러를 사용하여 인라인 어셈블리에 대한 도움이 필요합니다. 현재 표준 C++에는 DOS의 오래된 'CLS'기능과 동일한 메소드가 없습니다. 나는 표준/ANSI C++에서 빠져 나가기를 거부하고 Windows API를 사용하거나 그래픽 라이브러리를 사용하는 것은 문제가된다. 왜냐하면 크로스 플랫폼이 필요하기 때문이다. 이 어린 아이들에게 가르쳐지는 시스템 ("CLS") 루틴은 보안 문제에 대한 거대한 백도어를 열어 주며, Microsoft는 최종 사용자를 Windows에 묶어두고 싶어하기 때문에 문제가되지 않습니다. 저는 또한 수년간에 들어서고 어셈블리 언어를 배우기 위해 필요한 시간을 공헌 할 여력이 없기 때문에 인라인 어셈블리에 정통한 숙녀 여러분 중 한 명이 나에게 약간의 번역을 할 수 있기를 희망합니다. . 오랜 동안 어셈블리 프로그래밍을 해왔지만 잠시 후퇴 한 오랜 친구는 예전의 어셈블리 코드에 대해 두 조각을 뽑았는데, 그 중 하나는 사용자가 아무 키나 누르기를 기다리는 화면을 일시 중지합니다. 저는 C++에서 무수히 많은 시간을 보냈지 만 인라인 어셈블리에서 뭔가를 얻을 수 있는지 실험하고보고 싶습니다. 단지 더 빠르고 부드럽게 작동하는지 확인하기 위해서입니다. 두 번째 스 니펫은 실제로 DOS 'CLS'기능과 마찬가지로 진정한 화면을 수행합니다. 그래서 저는 C++ 프로그램에서 크로스 플랫폼 CLS에 대한 배심원 단련을 적어도 적용 할 수 있는지를 실험하기를 원했습니다. 내 친구는이 어셈블리 코드가 16 비트라고 생각하지만 2002 년에 은퇴 한 이후로 그는 기억할 수 없습니다. 그는 C++에 대한 지식이 없으므로 서로 도움이되지 않습니다. 내 코드에서 어디서든지 호출 할 수있는 함수를 분리하여 생성하고 싶습니다.표준 C++ 코드로 컴파일 된 인라인 어셈블리

내 자신보다 훨씬 밝은 사람이 어셈블리 코드를 인라인 어셈블리로 변환 할 수 있다면 매우 감사하게 생각하고 많은 C++ 코더에게 많은 도움이 될 것입니다. 이 코드를 Intel x86 \ 64 아키텍처에서 작동 할 위치로 번역해야하며, Windows 32 \ 64, Linux, UNIX, Ubuntu 또는 OS X에서 성공적으로 컴파일 할 수 있습니다 (개별 컴파일러 사용). 번역을 할 때 가능한 한 어셈블리의 핥기를 이해하지 못하기 때문에 읽고 배우려는 2 ~ 3 권의 책을 이해할 수 없기 때문에 가능하면 번역본을 읽으십시오. 기본적으로 복사하여 붙여 넣을 수 있어야합니다 (인라인 어셈블리 코드 및 컴파일해야하는 모든 요구 사항 만 사용 가능). 이 두 가지 기능이 필요합니다. 그 이유는 제가 일하는 회사에서 엄청난 양의 콘솔 앱을 저술하기 때문입니다. 내 역할은 주로 네트워킹과 인트라넷을 다루고 있습니다. IT 친구들은 콘솔 앱을 사용하여 오버 헤드를 줄이기 위해 작은 장난감을 구성해야하지만 텍스트 롤을 여러 번 보는 것보다는 프롬프트와 입력을 읽을 수 있어야합니다. 나는 이미 시스템 종속적 인 해킹으로 이것을 달성했으며, 그들이 프로그램과 상호 작용할 수있는 방식으로 현재 완벽하다고 생각한다. 그러나 나는 내년에 은퇴하기 전에 시스템 의존성을 벗어나 플랫폼 간 이동성을 높이고 고용주를 상당히보기 흉하지 않은 상태로 남겨두고 싶습니다.

죄송하지만이 게시물은 너무 길지만 도움이 필요합니다. 대단히 감사 드리며 누군가가 해결할 수있는 것이 있으면 크게 감사하겠습니다.

안부, GypsyPrince

예 : 16 비트 어셈블리 코드 (또는 이런 건)이 현대 운영 체제에서 작업 불행하게도 제로 기회가

#include <someheader> 

void clrscrn() // Clear user's screen like 'CLS'... 
{ 
     // Execute assembly code to clear screen... 
    mov ax,0A000h // Yes, this is the actual assembly code... 
    mov es,ax 
    xor di,di 
    xor ax,ax 
    mov cx,32000d  
    cld 
    rep stosw 
} 

void pauseapp(bool ShowPrompt = false) // Halt execution of program til user presses key... 
{ 
    if(ShowPrompt) // If the prompt is displayed... 
    { 
     std::cout << "\nPress any key to continue..."; // Prompt user to press a key... 
    } 

    /* Execute assembly code to halt program and wait for keypress - show flashing caret at end of prompt if prompt is displayed (just like in an IDE console)... */   
    mov ah,00 // Yes, this is the actual assembly code too...  
    int 16h 
} 


int main() 
{ 
    std::cout << "First block of text paused to give user time to read." << endl; 
    pauseapp(true) 

    clrscrn(); 
    std::cout << "Second block of text paused to give user time to read." << endl; 
    pauseapp(true) 

    clrscrn(); 
    std::cout << "Third block of text paused to give user time to read." << endl; 
    pauseapp(true) 

    clrscrn(); 

    return 0; 
} 
+2

조립품은 구현을 특정 OS에 묶는 것보다 낫지 않습니다. 우리는 아이들에게 무서운 유지 보수가 불가능한 코드 작성법을 가르쳐서는 안됩니다. 내가 아는 한, 당신이 추구하는 것은 표준 C++가 아닙니다. 컴퓨터 과학을 가르치는 사람으로서, 나는 새 프로젝트를 정의하거나 라이브러리를 사용하거나 여러 가지 크로스 플랫폼 라이브러리를 사용해야한다는 목표를 재정의하는 것이 좋습니다. – Mark

+0

타사 라이브러리를 사용할 의향이 없습니다. 이 나라는 이미 시스템 의존적 인 bloatware가 돌아 다니고 있습니다. 그러나 나는 귀하의 의견에 크게 감사드립니다. 감사! 나는 마이크로 소프트에서 길 아래에서 일하는 젊은 녀석에게 전달했고 어셈블리를 전문으로하고 그는 내가 필요로하는 것과 비슷한 것을 만들 수 있다고 확신한다. 내 프로그램. – GypsyPrince

답변

3

있다. 그것은 오늘날의 시스템에는 존재하지 않는 메모리 매핑 텍스트 디스플레이 영역에 달려 있습니다.

ANSI 이스케이프 코드를 사용할 수 있습니다 화면을 취소하는 대부분의 휴대용 방법 :

fputs(stdout, "\x1b[2J"); 

이 나열된 대부분의 플랫폼에서 작동 할 가능성이 있지만, 당신이 그것을 테스트해야합니다.

+0

'curses' 라이브러리 사용을 고려해보십시오. – Jester

+0

그레그에게 감사드립니다. 지금 이걸 시험 중입니다. 일부 유형의 그래픽 충돌이있을 수 있다는 것이 두려웠지만 그 곳에서 나보다 더 많은 경험을 가진 사람들이 나에게 확신을 줄 수 있도록 그 부분을 배치해야했습니다. 나는 주로 네트워크와 인트라넷을 수행하지 않을 때 데이터베이스와 마이닝을위한 백엔드를 작성한다. 나는 거의 그래픽을 다루지 못했다. 그러나 나는 시험해야만했다. 고맙습니다. 내 이웃이 나에게이 두 가지 기능을위한 도서관을 짓는 데 성공했다면 공개 도메인에 넣을 수 있다고했습니다 ... LOL 당신의 도움과 가치있는 지식을 감사하십시오! – GypsyPrince

관련 문제