2014-11-30 3 views
-1

저는 문자열을 바이트 단위로로드하여 x86에서 해당 문자열의 종료를 나타내는 null 값을 확인하려고합니다. I는 종래와 같은 LDRB를 사용 ARM 이것을 행한 :x86 가스 구문에서 ARM의 ldrb와 동일한 기능을 수행합니까?

loop: 
    ldrb r1, [r0], #1 //Load next byte of string into r0 
    cmp  r1, #0 //Check this byte against 0 
    beq  end //If the byte is equal stop and print 
    //... Other operations omitted 
    b  loop//Branch back to top 

이 예에서 R0는 문자열을 보유하고 LDRB이 루프 사이클 당 R1으로 다음 1 바이트를로드하는 데 사용된다. x86에서 대략 동일한 작업을 수행 할 것입니다.

답변

2

확실히 명령어 세트 참조가 있습니다. 기본적인 데이터 이동 및 비교 지침을 아는 방법은 없습니다. 스푼으로 먹는 것에 의존해서는 안됩니다. 상기

ldrb 86에 대응 movzbl는 ( MOV E ERO 연장 Z B YTE 옹리터 에, movzx 인텔 구문이라고도 함)이라고 부른다.

loop: 
    movzbl 1(%eax), %edx 
    cmpl $0, %edx 
    je end 
    // ... other operations omitted 
    jmp loop 

는 또한 86는 CISC이며 레지스터에로드하지 않고 0에 메모리에 값을 비교할 수 있습니다 의미 직접 메모리에 운영 지원 참고 : 여기에 r1에 대한 r0에 대한 eaxedx을 사용하여 샘플 구현입니다. 캐릭터의 가치를 필요로하지 않는다면 그것을 사용할 수 있습니다.

또한 x86 레지스터의 특정 부분을 직접 사용할 수 있습니다.이 경우 %edx의 하위 8 비트를 사용하려면 movb 1(%eax), %dl을 쓸 수 있습니다. 상위 24 비트는 변경되지 않으므로 바이트 크기 비교 만 사용해야합니다. 제로 테스트

비교 말하면, 일반 관용구는 test %edx, %edx 같이 피연산자가 모두 해당되는 레지스터와 and, testor 또는 명령들을 이용하여 포함한다. 이는 짧은 기계 코드를 생성하기 때문에 수행됩니다.

+0

감사합니다. 모든 것이 순서대로되어있는 것 같습니다. 정말 감사! 나는 명령어 세트에 대한 참조를 가지고 있지만, 다소 복잡하다. 나는 과거의 하루를 보냈다. – user3210373