2017-11-21 29 views
0

내가 입력 한 경우 : 커널에서 하드웨어컴퓨터가 ASCII 문자열을 부호있는 또는 부호없는 숫자로 바꾸는 방법은 무엇입니까? 예를 들어

1010

가 있을까 기반 또는 어딘가에 :

-6

어떤 메커니즘을 통해 그게으로 켜져 있습니까?

+0

왜 '1010 '으로 바뀌겠습니까? – melpomene

+0

1010은 이진수가 -6입니다. –

+1

아마도 4 비트 길이의 2의 보수가 될 것입니다 만, 누가 그것을 사용합니까? – melpomene

답변

1

하드웨어 기반이든 커널 어딘가에 있니?

일반적으로 아니오.

Linux와 같은 주류 OS의 커널은 대개 텍스트 바이트를 사용자 공간에 전달합니다.

그래서 사용자 공간 프로그램은 문자열, 즉 일련의 문자를 얻습니다. (간단한 경우, 예를 들어, UTF-8의 ASCII 서브 세트 인 경우, 각각의 문자는 단일 바이트이다.) 프로그램은 보통 문자 (숫자의 ASCII 코드를 나타내는)의 시퀀스를 2 진 정수로 변환하기 위해 atoi()과 같은 함수를 사용한다. 많은 프로그램이 정수를 나타내는 문자열을 처리해야하기 때문에 표준 라이브러리 함수이지만 다른 모든 소프트웨어 함수와 마찬가지입니다.

간단한 구현

int sum = 0; 
for (auto d: digits) { // look at digits in MSB-first order 
    sum = 10*sum + d; 
} 
// the first digit ends up being multiplied by 10 n times 
// the 2nd by 10 n-1 times, and so on. Each digit is multiplied by its place value. 

이 C++ 소스와 같은 루프를했을 것은 그것을 구현하는 여러 ASM의 지시로 컴파일 될 것이다. 무효화하여 옵션 -을 처리하는 것은 별도의 지시 사항입니다. 보통 일종의 neg 명령이나 2의 보수를 얻기 위해 0을 빼는 방법이 있습니다. (2의 보수 하드웨어를 가정 할 때).


명령 당/클럭주기 당 더 많은 작업을 수행하는 팬시 지침을 사용하여 속도를 높일 수 있습니다. 예를 들어, x86에서는 숫자의 여러 자리 문자열을 몇 개의 SIMD 명령어로 이진 정수로 변환 할 수 있지만 여전히 곱셈 및 덧셈 명령어 만 사용합니다. pmaddwd을 사용하여 자리 값의 벡터를 곱하고 수평으로 더하기 위해서는 How to implement atoi using SIMD?을 참조하십시오. 또한 Fastest way to get IPv4 address from string은 packed-compare로 수행 할 수있는 멋진 예제이며 그 비교 결과를 기반으로 테이블에서 pshufb 셔플 제어 벡터를 조회합니다.

입력을 숫자로 읽는 기능은 사용자 공간에서 구현되지만 후드에서는 read()과 같은 시스템 호출을 사용하여 데이터를 가져옵니다. (는 C 표준 입출력 입력 버퍼가 비어있는 경우.)


일부 "장난감"화성 및 SPIM MIPS 시뮬레이터와 같은/교육 시스템이 수 또는 인쇄 정수 (입력 또는 정수가 발생할 수 시스템 호출 레지스터). 이 경우 커널은 소프트웨어로 처리합니다.

구현에 따라 실제 커널이 전혀 없으며 syscall 명령어는 에뮬레이터/시뮬레이터의 입출력 기능으로 이스케이프되므로이 가상 시뮬레이트 된 머신 내부에서 실행되는 소프트웨어의 POV에서 실제로 정수 변환을위한 하드웨어 지원입니다.그러나 실제 하드웨어는 마이크로 코드 또는 실제 하드웨어에서 모든 것을 수행하지 않으며 적어도 주류 아키텍처는 아닙니다.