2016-09-27 11 views
0

の数が、私は、アセンブラで次のコードを持っている私を示しています。ありませんが、コンソール

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とを入れて、私を残していなかった、私は0x80を

+0

プラットフォーム? (OS +ビット)。 'のint 21h'は' 0x80'が32B LinuxのINT、 'syscall'が64BのLinux(またはあまりにもそれを使用して、他のOS)であり、MS-DOSです。あなたはあなたのものに固執する、他のOSのAPIを呼び出すことはできません。 (各APIは、それが '0x80'はほぼ確実にバグであるint型と一緒になってそう'ああ、MOV、02h' ...独自の関数やパラメータですが、Linuxの32BのAPIはeax' 'に値を期待しています)。 – Ped7g

+0

@ Ped7g私はubuntu 64ビットのLinuxとyasmを使用していますが、もし私がsyscallを使っているのであれば、 –

+0

@ Ped7g、私はsyscallを置くと出てきます: "違反セグメント( 'core'生成) –

答えて

1

警告int型を変更し、この答えはあなたが必要なもの、あなたを助けにはなりませんいくつかのデバッガを取得し、使用することを学ぶことですそれ(GDBは、ほとんどどこでも* NIXにおけるので、それは一度サーバーがうまく。私は何も覚えていないことができますので、私はほとんど常にいくつかのバグがあり、いくつかのGUIのものを、使用しますが、「EDB」は、このためにOKである学習です私のための小さなASMのもの)。ここで

が私のために働くあなたの多少の固定のLinux 64bのアセンブリコード、次のとおりです。

; 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 
関連する問題