2011-08-13 15 views
1

私は、このアセンブリプログラムでさまざまなアスキー文字を印刷しようとしています。 私はレジスタだけを使ってそれをやろうとしていますが、それほど幸運はありませんでした。すべてがうまく見えますが、私はアセンブリプログラミングの初心者であり、明らかに何かを見逃している可能性があります。どんな洞察にも感謝します。おかげで:)x86アセンブリのレジスタからASCII文字の範囲を印刷する

はテキスト を強調したの.text .GLOBAL _start

_start: 
movl $1, %edx 

movl $65, %ebx 
start_loop: 
addl $1, %ebx 
movl $0x04, %eax 
int $0x80 
cmpl $126, %ebx 
jle start_loop 
jmp start_loop 

exit 
movl $0, %ebx 
movl $1, %eax 
int $0x80 
+1

問題が何ですか?あなたのプログラムが決して止まらないならば、あなたの 'jle'と' jmp'命令が両方ともループの先頭に行くからです。 – ughoavgfhw

答えて

3

あなたはSYS_WRITEシステムコールを呼び出しています。 sys_write()は3つの引数、出力デバイスのファイル記述子(stdoutの場合は1)、印刷する値を格納したバッファのアドレス、および印刷するデータのサイズをとります。したがって、ファイルディスクリプタを%ebxに格納し、バッファのアドレスを%ecxに格納し、データのサイズを%edxに格納する必要があります。ファイルディスクリプタを格納するには、次の命令を使用できます。

  movl $1, %ebx  // store 1 (stdout) in ebx) 

使用できるデータのサイズストアに:今

  movl $1, %edx  // size is 1 byte 

を、あなたはバッファのアドレスを格納する必要があり、あなたはメモリ内にいくつかの場所や必要性を、あなたのデータを配置する必要があります%ecxにメモリのアドレスを格納します。

  subl $4, %esp  // get 4 bytes of memory in the stack 
      movl $65, (%esp) // store data in the memory where esp points to 
      movl %esp, %ecx // store address of the data in the ecx 

ここで、int 0x80を発行することができます。次のようにして、データをスタックに格納することができます。あなたは以下のコードを書くことができ、全体として

  movl $04, %eax // store syscall number in eax  
     int $0x80  // issue the trap interrupt 

movl $1, %ebx 
    subl $0x4, %esp 
    movl $64, (%esp) 
    start_loop: 
    movl (%esp), %eax 
    addl $1, %eax 
    movl %eax, (%esp) 
    movl %esp, %ecx 
    movl $1, %edx 
    movl $0x04, %eax 
    int $0x80 
    movl (%esp), %eax 
    cmpl $126, %eax 
    jle start_loop 
    addl $0x4, %esp 

を参照してくださいLinuxのシステムは、レジスタの詳細については知っているhttp://www.rulingminds.com/syscallspart2でパート2を呼び出し、そのシステムは、使用を呼び出します。

+0

+1 BTWそれらのコードブロックが正しく表示されるには、改行が必要です。 – user786653

1

"有益な答えをありがとうございますが、指し示すことなくレジスタに印刷する値を格納して取得する方法はありますか?"これはおそらく質問に編集されているはずです。

システムとのインターフェイスにsyscalls(int $0x80)だけを使用することを主張するなら、答えはいいえです。何とかバッファーをwriteに渡して、rullingmindsの回答を適用する必要があります。

libc putchar(3)を使用すると簡単です。私は%ebxを使用して、このレジスタは関数呼び出しの間にlinuxに保存されているので、asciiコードを保持します。 gcc filename.S(x86_64の場合は-m32を使用してください)を使用して簡単にアセンブルします。

.text 

.extern putchar 

.global main 
main: 
    # make room for argument to putchar on the stack 
    sub $4, %esp 

    # initialize ebx with first value to print 
    mov $'A', %ebx 
1: 
    # give character to print as argument 
    mov %ebx, (%esp) 
    call putchar 

    # move to next character 
    inc %ebx 

    # are we done? 
    cmp $'~', %ebx 
    jle 1b 

    # print newline 
    movl $10, (%esp) 
    call putchar 

    # adjust stack back to normal 
    add $4, %esp 

    # return 0 from main 
    mov $0, %eax 
    ret 
関連する問題