2014-07-22 2 views
0

어셈블리 언어를 사용하고 있지 않습니다. 나는 Ubuntu-Linux에서 nasm을 사용하고 있습니다. 나는 책에서 예를 발견했다. 그러나 올바르게 작동하지 않습니다. 문제를 찾을 수 없었습니다. 저 좀 도와 주 시겠어요?NASM의 ascii 문자가 올바르게 작동하지 않습니다.

감사합니다. 그것은 가장 큰 자리를 찾아야한다

section .text 
    global main 
main: 
    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 
    mov eax, 4 
    int 0x80 
    mov ecx, largest 
    mov edx, 2 
    mov ebx, 1 
    mov eax, 4 
    int 0x80 
    mov eax, 1 
    int 80h 
section .data 
    msg db "The largest digit is:", 0xA, 0xD 
    len equ $- msg 
    num1 dd '17' 
    num2 dd '52' 
    num3 dd '31' 
segment .bss 
    largest rest 2 

다음과 같이

내 코드입니다. 그러나 결과는 가장 큰 숫자는

입니다 :

17

답변

0

코드는 한 자리 숫자 작동합니다. 나는 그 책의 원래 코드가 그런 숫자를 사용했다고 가정하지만 그것을 바꿨다.

문제는 바이너리에서 텍스트로의 변환이 필요 없도록 숫자가 문자열로 저장된다는 것입니다. 숫자의 ASCII 코드는 연속적이며 숫자 값과 순서가 같기 때문에 한 자리 숫자로 작동합니다. 따라서 예를 들어 dd '2'을 작성하면 4 바이트의 기억 장치를 할당하며 0x32 0x00 0x00 0x00 (0x32은 2의 ASCII 코드)이됩니다. 그런 다음 코드는이 바이트를 32 비트 이진수로 사용하므로 x86이 리틀 엔디안 아키텍처이기 때문에 프로세서에서이 바이트를 0x00000032으로 해석합니다. 모든 단일 숫자에 대해 이것이 어떻게 작동하는지 확인하시기 바랍니다. 엔디안은 CPU가 오른쪽에서 왼쪽의 숫자를 고려하게됩니다 (최대 4) 여러 숫자에 대한

, 즉 귀하의 예제에서 숫자가 각각 71, 2513 (*)로 해석 될 것입니다. 71이 그 중 가장 큰 숫자이기 때문에 그 번호에 대한 항목이 인쇄됩니다. 문자열은 17입니다.


* 실제로 숫자는 0x00003731, 0x00003235 및 0x00003133입니다.

+0

대단히 감사합니다. 이것은 매우 도움이되었습니다. 숫자의 자릿수 크기는 변경하지 않았습니다. 원래 숫자는 '47', '22'및 '31'이었습니다. 따라서 코드는 우연히 올바른 결과를 발견했습니다. 이 책은 그것에 대해 아무 것도 언급하지 않습니다. 어쩌면 당신은 그런 책을 써야 할 것이다 :) 한가지 더 : 그것은 항상 4 바이트의 데이터가 메모리 주소로부터 32 비트 레지스터로 옮겨지는 것을 보장 하는가? 고맙습니다. – user2972185

+0

각 바이트는 8 비트이므로 예, 32 비트는 4 바이트입니다. 더 작은 데이터를 더 작은 레지스터에로드하거나 부호/제로 확장 ('MOVSX','MOVZX')을 사용할 수 있습니다. – Jester

0

따옴표없이 num1 dd 17을 작성해야합니다. 따옴표를 사용하면 Jester 언급과 같이 매우 이상한 결과를 얻을 수 있습니다.

책에있는 코드 샘플이 매우 좋지 않습니다.

그런데 디버거에서 코드를 실행하여 실험 해보십시오.

+0

도와 주셔서 감사합니다. 나는 nano를 사용하여 코드를 작성하고 nasm과 gcc로 컴파일했다. 우분투 - 리눅스에서 어셈블리 코드를 디버깅 할 수있는 도구가 있습니까? – user2972185