2016-09-27 2 views
0

다음 코드가 어셈블러에 있습니다.No 콘솔에 번호를 표시합니다.

콘솔에서 아무 것도 표시되지 않으면 어떻게됩니까? 최종 번호를 알려주시겠습니까?

section .text 
global _start 
_start: 

inicio:  
    mov ax,12345 
    mov cx,5 
    mov dx,0 
imprime: 
    mov bx,10 
    div bx 
    add dl,30h 
    mov dh,0 
    push dx 
    mov dx,0 

    loop imprime 
    mov cx,5 
    imp:  
     mov ah,02h 
     pop dx 
     int 0x80 
     loop imp 

mov rax, 60 
mov rdi, 0 
syscall 

나는 그것을 인쇄 할 INT의 21H를 넣고 나를 떠나지 않았다, 나는이 대답은 당신이 필요로하는 어떤 디버거를 얻을 수 있습니다, 당신을 도울하고 사용하는 방법을 배우게하지 않습니다 INT 0x80으로

+0

플랫폼 : 여기

은 나를 위해 작동하는, 당신의 다소 고정 된 리눅스 (64B) 어셈블리 코드? (OS + 비트). 'int 21h'는 MS-DOS이고,'int 0x80'은 32b 리눅스이고,'syscall'은 64b 리눅스입니다 (또는 다른 OS에서도 마찬가지입니다). 당신은 다른 OS의 API를 호출 할 수 없다. (그리고 각 API는 자신의 함수와 매개 변수를 가지고 있기 때문에'mov ah, 02h'와'int 0x80 '은 거의 확실하게 버그이며 리눅스 32b API는'eax'에서 값을 기대합니다). – Ped7g

+0

@ Ped7g 나는 우분투 64 비트 리눅스와 yasm을 사용하지만, 만약 내가 syscall을 사용한다면 –

+0

@ Ped7g 내가 syscall을 넣으면, 나오는 것 : "Violation segment ('core'generated)" –

답변

1

경고 변경 (gdb은 * NIX의 거의 모든 곳에서 사용 가능하므로 한 번 배우면 좋은 서버가 될 것입니다. 아무 것도 기억할 수 없기 때문에 일부 버그가있는 GUI 도구를 사용하지만 "edb"는 정상입니다. 나를위한 작은 짐 재료).

; Kate build command (%f = file name, %n = name without extension): 
; nasm -f elf64 -l %n.lst %f; ld -melf_x86_64 -o %n %n.o 

section .data 
    char_buffer db '_' ; buffer to store characters to print 

section .text 
    global _start 

_start: 
    xor ecx,ecx  ; clear rcx! LOOP in 64b doesn't use only "cx" 

    ; store 5 ASCII chars on stack (decimal format of value in ax) 
    mov ax,12345 
    mov cx,5 
    mov dx,0 
imprime: 
    mov bx,10 
    div bx 
    add dl,30h 
    mov dh,0 
    push dx 
    mov dx,0 
    loop imprime 

    ; print 5 stored ASCII chars on stack 
    mov cx,5 
    mov rdi,1   ; stdout 
    mov rsi,char_buffer ; memory buffer for number 
imp:  
    pop dx 
    mov [rsi],dl  ; update number in buffer 
    mov rax, 1   ; sys_write 
    mov rdx, 1   ; 1 byte length 
    push rcx   ; rcx is not preserved by syscall 
    syscall 
    pop rcx    ; restore rcx for LOOP 
    loop imp 

    ; print new line 
    mov [rsi],byte 10 ; NL char into buffer 
    mov rax,1   ; sys_write 
    ; other arguments are valid from previous call 
    syscall 

    ; sys_exit 
    mov rax,60 
    mov rdi,0 
    syscall 
관련 문제