다른 접미사 (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
이
문제를 확대하는 데 도움이되는 프로그램은 여러 procs (DISP_HEX, DISP_BIN, DISP_OCT 및 DISP_INT)에서 예상대로 작동합니다. 그래서 문제는 외부적인 것이 아닙니다. 유일한 문제는 signess 처리를 프로그램에 추가 한 후 부호없는 값을 처리 할 때입니다. – royalfinest
아무도 없습니까? 더 많은 코드를 게시해야합니까? 그러나 나는 그것이 필요하다고 생각하지 않는다. – royalfinest
.translate 레이블 아래에 다른 코드를 삽입하여 쉽게 해결할 수 있지만 그게 내 질문의 핵심은 아닙니다. 나는 syscall로 무언가가 옳지 않은 것으로 의심한다. 글쎄, 나는 틀렸어. – royalfinest