추가로 안적은 부분이 asam이라는 ide로 작성중입니다.
코드에 나오는 매크로함수는 asam에서 제공해주는 메크로함수입니다. 

다시 코드이야기좀 하자면
문제되는부분이 새로 넣은 소스의 13라인쪽이였습니다.
eax에 값을 넣으면 rax부분의 앞자리에 1이 추가로 들어가는 이상한일이 발생해서 계속 막혔는데
그냥 14라인쪽 추가해서 막아놨습니다;;;;;
그리고 출력부분을 잘나오도록 수정했습니다.

그런데 이 해결방법은 아무리봐도 이건좀 아닌거같은데 일단 그냥 이렇게 넘어가려합니다.

부디 멀쩡한 해결방법좀 알려주세요.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
%include "io64.inc"
 
section .text
global CMAIN
CMAIN:
    mov rbp, rsp; for correct debugging
    GET_DEC 2, ax
    mov [target], ax
L_loop:
    mov eax, 0
    mov edx, 0
 
    mov eax, dword [target]
    and eax, 0x0000ffff
    
    mov edx, eax
    shr edx, 16
    and eax, 0x0000ffff
 
    mov ebx, 0
    mov bx, 2
    div bx
    
    mov ebx, [remainder_index]
    mov [remainder + ebx * 2], dx
    add [remainder_index], word 1
 
    mov [target], ax
    cmp ax, 1
    jle L_loop_end
    jmp L_loop
L_loop_end:
    ;print
    PRINT_DEC 2, target
    ;NEWLINE
    
    mov eax, 0
    mov eax, [remainder_index]
    dec eax
    
L_print_loop:
    PRINT_DEC 2, [remainder + eax * 2]
    ;NEWLINE
    add [print_count], word 1
    
    dec ax
    mov bx, [print_count]
    cmp bx, [remainder_index]
    je L_end
    jmp L_print_loop
L_end: 
    xor rax,rax
    ret
section .bss
    target resw 1
    remainder resw 100
section .data
    remainder_index dw 0
    print_count dw 0
cs


//// 아래부터 수정 이전글

NASM에 대해 다루는 게시판좀 찾다보니 여기까지 왔습니다.

게임처럼 쉽고 재미있게 배우는 어셈블리 언어 튜토리얼 이라는 책으로 어셈블리를 공부하는중인데
반복문 챕터의 문제에서 막혓어요;;

문제는
사용자로부터 2byte 의 10진수를 입력받고 입력받은수를 2진수로 출력하라.
라는 문제입니다.

거기에 대해 아래의 소스처럼 했으나 돌리면 크래쉬 라고 뜨네요.;;;


target으로 입력받아서
2로 나누면서 나머지를 remainder배열에 저장하면서
몫은 계속 target에 넣는식으로해서

마지막에 역으로 출력하려고합니다.

프린트하는 부분이 지금보니 순서대로 출력하도록 한듯합니다만 

아예 돌리면 크래쉬되면서 동작하지 않습니다.

디버그 돌리다보면 eax부분에 값이 이상하게 복사되고있어서 난감합니다...

혹시 뭐가 잘못됐는지 도와주실분이 계실까요 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
%include "io64.inc"
 
section .text
global CMAIN
CMAIN:
    mov rbp, rsp; for correct debugging
    GET_DEC 2, ax
    mov [target], ax
L_loop:
    mov eax, 0
    mov eax, [target]
    mov edx, eax
    shr edx, 16
    and eax, 0x0000ffff
 
    mov ebx, 0
    mov bx, 2
    div bx
    
    mov ebx, 0
    mov bx, [remainder_index]
    mov [remainder + ebx * 2], dx
    add [remainder_index], word 1
 
    mov [target], ax
    cmp ax, 1
    jne L_loop
 
    ;print 
    mov eax, 0
    mov bx, [remainder_index]
    
    PRINT_DEC 2, ax
    NEWLINE
L_print_loop:
    PRINT_DEC 2, [remainder + eax * 2]
    NEWLINE
    inc ax
 
    cmp ax, bx
    jne L_print_loop
 
L_end:
    xor rax,rax
    ret
section .bss
    target resw 1
    remainder resw 100
section .data
    remainder_index dw 0
cs

-- 추가로 내용을 적습니다
nasm으로 옴기려고하는 c소스는 아래와같습니다. 이렇게 간단한건데 막히니까 공부할맛이 안나네요

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
 
int main(int argc, const char * argv[]) {
    int target = 0;
    int remain[100= {0,};
    int index = 0;
    scanf("%d",&target);
    while (target > 1) {
        remain[index] = target % 2;
        target = target / 2;
        index++;
    }
    printf("%d\n",target);
    for (int i = index - 1; i >= 0; i--) {
        printf("%d\n", remain[i]);
    }
    return 0;
}
 
cs