프로그래밍

 3198, 1/160 회원가입  로그인  
   woonkeekim
   어셈블리어 질문좀 드릴꼐요

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=6476 [복사]


안녕하세요?
어셈블리어 공부도중에 compare 하는 부분에서 막혀서 질문 드려봅니다...
어셈블리어 고수분들 도와주세요

section .text
    global _start         ;must be declared for using gcc

_start: ;tell linker entry point
        mov   ecx, [num1]
        cmp   ecx, [num2]
        jg    check_third_num
        mov   ecx, [num2]
   check_third_num:
        cmp   ecx, [num3]
        jg    _exit
        mov   ecx, [num3]
   _exit:
        mov   [largest], ecx
        mov   ecx,msg
        mov   edx, len
        mov   ebx,1     ;file descriptor (stdout)
        mov   eax,4     ;system call number (sys_write)
        int   0x80      ;call kernel
        mov   ecx,largest
        mov   edx, 2
        mov   ebx,1     ;file descriptor (stdout)
        mov   eax,4     ;system call number (sys_write)
        int   0x80      ;call kernel
    
        mov   eax, 1
        int   80h

section .data
    msg db "The largest digit is: ", 0xA,0xD
    len equ $- msg
    num1 dd '52'
    num2 dd '54'
    num3 dd '56'

segment .bss
   largest resb 2  

이 코드가 num1, num2, num3 중에서 가장 큰 숫자를 프린드 해주는 코드인데요

몇몇숫자를 집어 넣으니 잘 돌아가는거 같습니다

근데 이 상태에서 num1의 숫자를 num1 dd '47' 이렇게 바꾸니 47로 프린트가 되는데 혹시 이유와 고치는 방법을 알려주실수 있는분 계신가요??

아무리 생각해도 이유를 잘 모르겠습니다

  Hit : 4630     Date : 2014/06/29 04:15



    
cd80 num들을 dd '~~'로 하셔서
'52'가 0x3235
'54'가 0x3435
'56'이 0x3635
'47'로 하셨을땐 0x3734로 되기때문에 47이 크게 나옵니다

정수를 문자열로 넣으셔서 생기는 오류에요
2014/06/29  
woonkeekim 답변 감사합니다

한가지만 더 여쭤봐도 될까요?

그렇다면 어떻게 정수를 num1 에 넣을수 있나요??

' 를 빼고 하면 제대로 출력을 하지 못하는거 같더라구요
2014/06/30  
cd80 사용하신 시스템콜은 출력 데이터를 문자열형태로만 받는 시스템콜이라
숫자를 문자열형태로 변환하셔야해요
snprintf 사용하시면됩니다
2014/06/30  
woonkeekim 답변 감사합니다

만야게 정수를 넣고싶다면 어떤식으로 해야하나요??

''이거 없애도 안되는거 같더라구요
2014/06/30  
woonkeekim 답변 감사합니다

그렇다면 어떤식으로 정수를 num1에 집어 넣을수 있나요?
2014/06/30  
woonkeekim 위 두 댓글은 무시해주세요.. 댓글 등록이 안되길레 몇번더 적었더니 이런식으로 됬네요 죄송합니다 2014/06/30