2012-05-26 3 views
2

원시 모드에서 문자를 읽는 프로그램이 있습니다. 즉, 입력 된 모든 문자는 버퍼링되는 대신 즉시 읽혀집니다.YASM 또는 NASM 어셈블리에서 백 스페이스 수행

백 스페이스 수행 방법을 알고 싶습니다. 즉, Backspace 키를 누르면 왼쪽의 문자가 삭제되고 커서가 한 곳 왼쪽으로 이동합니다.

공백 문자 뒤에 백 스페이스 문자를 출력 해 보았습니다. 이렇게하면 왼쪽에있는 문자가 삭제되지만 어떤 이유로 든 커서가 두 개의 공백을 두 칸 이동합니다.

나는 자체적으로 백스 페이스 문자를 출력 해 보았습니다. 그러면 커서가 한 칸 왼쪽으로 이동하지만 문자는 삭제되지 않습니다.

내 어셈블러는 YASM이고 64 비트 Linux를 사용하고 있습니다. 다음은 관련 코드입니다.

먼저, 여기에 내가 문자 출력에 사용하는 기능입니다 :

printchar:      
     mov  [buf], al  ; Backup whatever was in al. 
           ; buf is declared as resb 1 in section .bss 
     mov  edx, 1 
     mov  ecx, buf 
     mov  ebx, 1 
     mov  eax, 4 
     int  0x80 
     mov  al, [buf] ; restore char that was previously in al 
     ret 

다음 코드는 백 스페이스를 인쇄합니다. 일반 백 스페이스처럼 커서를 한 곳 왼쪽으로 이동하지 않습니다.

mov  al, 0x08 ; ASCII for Backspace 
    call printchar 

이 코드는 백 스페이스 다음에 공백을 인쇄합니다. 커서를 단지 두 개가 아닌 오른쪽으로 두 칸 이동합니다.

mov  al, 0x08 ; ASCII for Backspace 
    call printchar 
    mov  al, 0x20 ; ASCII for Space 
    call printchar 

Len은 백 스페이스를 인쇄하고 스페이스와 백 스페이스를 차례로 제안합니다.

mov  al, 0x08 ; ASCII for Backspace 
    call printchar 
    mov  al, 0x20 ; ASCII for Space 
    call printchar 
    mov  al, 0x08 ; ASCII for Backspace 
    call printchar 

내가 앞서 언급 한 바와 같이, 나는 원시 모드에서 문자를 읽어하고, 유의하시기 바랍니다 :이 작동하는 것 같다. 미리 감사드립니다!

답변

3

나는 백 스페이스 문자 자체를 출력하려고 시도했다. 그러면 커서가 한 칸 왼쪽으로 이동하지만 문자는 삭제되지 않습니다.

거의 다 왔어! 백 스페이스를 출력 한 다음, 커서가 위에있는 문자를 검게 할 일반 공간을 누른 다음 다른 백 스페이스를 사용하여 커서를 다시 한 번 뒤로 이동하십시오.

해킹처럼 보이지만 실제로는 매우 일반적입니다.

+0

좋아, 어떻게 그런 생각을하지 않을만큼 바보 같습니까 !! :) 고마워. 그런데 백 스페이스 뒤에 공백을 출력하면 왜 커서가 두 개가 아닌 공백으로 이동하게됩니까? 이것은 "실제"ASCII Backspace가 커서를 움직이지 않는다는 것을 의미합니까? – InvalidBrainException

+0

@Terribad : 그건 아주 이상 해요! 나는 답을 말할 때 어떻게 든 그 단락을 훑어 보았다. 그러나 나의 유일한 생각은 어쩌면 어떤 다른 결과물이 그 과정을 어떻게 든 혼란스럽게 만들었다는 것이다. 내 제안 솔루션이 작동하지 않는 경우, 문제를 나타내는 코드를 제공 할 수 있다면 문제가 해결 될 때까지 해킹을 시도해 볼 수 있습니다. :) – Ashe

+0

하지만 효과가 있습니다! 원래 코드를 몇 가지 코드로 업데이트합니다. – InvalidBrainException

관련 문제