2014-11-15 3 views
0

다른 접미사 (h-hex, b-bin 등)를 사용하는 어셈블리에서 scanf를 시뮬레이션하려고합니다. 이것은 부호없는 값에 대해서는 문제가 없지만 서명 된 값을 사용하려면 아래 5 줄을 추가 한 후 서명되지 않은 값을 입력하면 앞자리 숫자가 누락되는 문제에 부딪혔지만 서명 된 값에는 예상대로 작동합니다.FASM과 함께 FASM을 사용하여 접미사가있는 숫자를 읽는 중

;Linux Mint 17 (64-bit) 
;./fasm scanf.asm 
;./scanf 
format elf64 executable 
include 'PROC64.INC' 
include 'IF.INC' 

    push tstValue  
    call SCANF 

    push 1   ;sign 
    push [tstValue] ;No problem here 
    call DISP_INT 

    call EXIT 
    tstValue dq 0 

proc SCANF,value 
    locals 
     flag db 0 
     key rb 1 
    endl 
    push rsi rdi rax rcx rdx 
    push rbx r8 r9 r10 

    xor  r10,r10 
    xor  r8,r8   ;loop index 
    lea  rsi,[key] 
    mov  edx,1  
    xor  edi,edi  
    xor  eax,eax   ;Problem starts after I  
    syscall     ;added these 
    cmp  byte[key],'-' ;5 new lines to allow signess 
    jne  .begin   ; 
    mov  byte[flag],1 ; 
.begin: 
    xor  rax,rax 
    syscall 
    mov  r10b,byte[rsi] 
    cmp  r10b,0ah 
    jz  .select 
    push r10 
    inc  r8 
    jmp  .begin 
.select: 
    pop  rax 
    cmp  al,'h' 
    je  .hexadecimal 
    cmp  al,'H' 
    je  .hexadecimal 
    cmp  al,'b' 
    je  .binary 
    cmp  al,'B' 
    je  .binary 
    cmp  al,'o' 
    je  .octal 
    cmp  al,'O' 
    je  .octal 
    cmp  al,'d' 
    je  .decimal 
    cmp  al,'D' 
    je  .decimal 
    push rax  ;if no suffix, defaults to decimal 
    inc  r8  ;re-adjust index 
.decimal: 
    xor  r9,r9 
    pop  rax 
    sub  rax,30h 
    add  r9,rax 
    mov  rcx,10 
    mov  rbx,10 
    dec  r8 
    jmp  .translate 
.hexadecimal: 
    xor  r9,r9 
    pop  rax 
    .if al >= 'a' & al <= 'f' 
     sub rax,27h 
    .elseif al >= 'A' & al <= 'F' 
     sub rax,7h 
    .endif 
    sub  rax,30h 
    add  r9,rax 
    mov  rcx,16 
    mov  rbx,16 
    dec  r8 
    jmp  .translate 
.octal: 
    xor  r9,r9 
    pop  rax 
    sub  rax,30h 
    add  r9,rax 
    mov  rcx,8 
    mov  rbx,8 
    dec  r8 
    jmp  .translate 
.binary:  
    xor  r9,r9 
    pop  rax 
    sub  rax,30h 
    add  r9,rax 
    mov  rcx,2 
    mov  rbx,2 
    dec  r8 
    jmp  .translate 
.translate: 
    dec  r8 
    jz  .exit 
    pop  rax 
    .if al >= 'a' & al <= 'f' 
     sub rax,27h 
    .elseif al >= 'A' & al <= 'F' 
     sub rax,7h 
    .endif 
    sub  rax,30h 
    mul  rcx 
    add  r9,rax 
    mov  rax,rbx 
    mul  rcx 
    mov  rcx,rax 
    jmp  .translate 
.exit:  
    mov  rax,[value] 
    .if [flag] = 1 
     neg r9 
    .endif 
    mov  [rax],r9 
    pop  r10 r9 r8 rbx 
    pop  rdx rcx rax rdi rsi 
    ret 
endp 

내가 그 .begin 라벨 전에 모든 레지스터를 확인하고 예상대로 작동 모두 (그래서 콜은 단일 문자를 읽기위한 올바른 인수를해야한다, EAX = 0, EDX = 1, EDI = 0, rsi는 문자를 가리 킵니다). 문제의 5 줄을 모두 지우면 정상적으로 작동하지만 서명되지 않은 프로그램 만 남게됩니다.

아무도 내가 무슨 문제인지 지적 해 줄 수 있습니까? 나는 생각이 부족한 것 같다. 나는 .begin을 부르기 전에 나의 색인 (r8)을 강요하거나 증가시키지 않았다. 스택 또는 인덱싱 문제를 취소해야합니다.

이 하나 (서명을 위해) 작동 부호

3455 ;keyboard input 
455 

의 출력

-3455 
-3455 

+0

문제를 확대하는 데 도움이되는 프로그램은 여러 procs (DISP_HEX, DISP_BIN, DISP_OCT 및 DISP_INT)에서 예상대로 작동합니다. 그래서 문제는 외부적인 것이 아닙니다. 유일한 문제는 signess 처리를 프로그램에 추가 한 후 부호없는 값을 처리 할 때입니다. – royalfinest

+0

아무도 없습니까? 더 많은 코드를 게시해야합니까? 그러나 나는 그것이 필요하다고 생각하지 않는다. – royalfinest

+0

.translate 레이블 아래에 다른 코드를 삽입하여 쉽게 해결할 수 있지만 그게 내 질문의 핵심은 아닙니다. 나는 syscall로 무언가가 옳지 않은 것으로 의심한다. 글쎄, 나는 틀렸어. – royalfinest

답변

1

당신이 주석 한 네 번째 라인은 2 도약해야한다 사전에 감사하다 라인이 더. 그래서 서명되지 않은 값의 첫 번째 숫자가 손실됩니다!

+0

감사합니다. 나는 항상 부주의합니다. – royalfinest