2016-12-16 1 views
0

그래서 내 코드는 현재 문자열을 정수로 변환합니다. 내 코드는 현재 작동하고 기능적이지만 입력이 시작될 때 음수인지 아닌지 판단하기 위해 "-"를 받아야합니다. 어떻게 해야할지 모르겠지만 소스를 찾을 수 없습니다. 나는 현재 (test3 : .asciz "-48") 레지스터 r0에 전달 중이다. 디버거에서 실행할 때 나는 45를 받고있다. 여기에 참조 용 코드가있다.ARM 어셈블리에서 '-'허용

.global stoi 
    .text 
stoi: 
    push {r4,r5,r6,r8,r9,lr} 
    @r0 = buffer 
    mov r1,#0   @r1 = n = 0 
    mov r9,#0   @buffer counter 
    mov r4,#48  @0 checker 
    mov r5,#57  @9 checker 
    b 5f 

5: 
    ldrb r3,[r0,r9]  @r3 = c 

    b 1f 

1: 
    cmp r3,r4   @cmp c to 0(48 in ASCII) 
    bge 2f 
    b 4f 
2: 
    cmp r3,r5  @cmp c to 9(57 in ASCII) 
    ble 3f 
    b 4f 
3: 
    sub r6,r3,#'0'  @r6 = (c - '0') 
    @strb r6,[r0,r9] 
    add r1,r1,r1,lsl#2 @r1 = n * 10 
    add r1,r1,r1,lsl#0 

    add r1,r1,r6  @n = n * 10 + (c - '0') 

    add r9,r9,#1  @add to buffer 
    b 5b 

4: 
    mov r0,r1 
    pop {r4,r5,r6,r8,r9,pc} 
+0

힌트 : 작업에 익숙한 고급 언어로 알고리즘을 구현 한 다음 레벨을 대략적으로 일치시키기 위해 참조 구현을 점차적으로 낮 춥니 다. 어셈블리 코드의 기능을 설명합니다. – doynax

+0

조언을 주셔서 감사합니다,하지만 난 코딩 세계에 새로운 오전 그리고 iv는 지금까지 배운 언어는 파이썬입니다. 그것은 단순한 "int (문자열)"입니다. –

+0

요점은 어셈블리 언어의 세부 사항은 알고리즘을 이해하지 못하는 것입니다. 플로우 차트 나 다른 방법을 통해 지원 기능을 사용하지 않고 Python으로 손으로 수행하는 방법의 원리를 스케치합니다. 그런 다음 어셈블리 코드를 작성하고 구현하십시오. – doynax

답변

4

은 현재 사용하고있는 동일한 코드를 사용하고, 이러한 변경 사항을 추가

1) 건너 뛰기 '-'가 첫 번째 문자 인 경우에. 숫자가 아닌 문자가 읽히고 45 자 (R3)를 받으면 '-'의 ascii입니다. '-'Afais R1은 여전히 ​​첫 문자가 있는지 확인을 추가 끝에

2) 그래도 0이어야 0 및 그 경우 뺄셈 R1 (0 이후 - X)

-x이며

(3) b 1f를 제거하십시오. 필요하지 않습니다.))

+1

@Blake : 더 일반적으로 무조건 분기를 건너 뛰는 대신 분기 조건을 단일 분기 또는 통과 명령으로 반전하여 다른 분기를 정리합니다 . 그리고 단순히 숫자가 아닌 지사 레이블에 의미있는 이름을 사용하십시오. –