28670


アセンブリの練習のためにbmi(Body Mass Index)を計算するプログラムを書いています。  
最初に`your_height`を表示してからstdinを読み込もうとするのですが、`your_height`の最初の1文字を表示した後、すぐにプログラムが終了してしまいます  
なぜなのでしょうか?

環境: Ubuntu 16.04 x86_64 (gccでのコンパイル時に`-m32`をつけてx86として実行)

[code]

    .data
    emessage: .string "file open error\n"
    your_height: .string "Please enter the your height  (m):  "
    your_weight: .string "Please enter the your weight  (kg):  " 
    newline: .string "\n"
    
    .bss
    tmp: .skip 128, 0x00
    
    .text
    .global main
    main:
        push %ebp
        movl %esp, %ebp
        pushl $your_height
        call print
        call read
        pushl $your_weight
        call print
        call read
        movl -4(%ebp), %eax
        movl -8(%ebp), %ebx
        divl %ebx
        divl %ebx
    
    
    read:
        movl $3, %eax
        movl $0, %ebx
        movl $tmp, %ecx
        movl $64, %edx
        int $0x80
        cmpl $-1, %eax
        je write_error_message
        movl %eax, %esi
        pushl %esi
        ret
    
    write_error_message:
        movl $4, %eax
        movl $1, %ebx
        movl $emessage, %ecx
        movl $16, %edx
        int $0x80
        call exit
    
    exit:
        movl $1, %eax;
        xorl %ebx, %ebx;
        int $0x80
    
    print:
        movl $4, %eax
        movl 4(%esp), %ecx
        movl $1, %ebx
        movl $1, %edx
    write:
        cmpb $0x00, (%ecx)
        je ret_func
        int $0x80
        incl %ecx
        jmp write
    
    
    ret_func:
        ret
    
[/code]


CC BY-SA 3.0
2016-09-03T11:33:24.207
28668
2016-09-03T12:56:49.010
2016-09-03T12:56:49.010
5246
5246
question
assembly
アセンブリでプログラムが終了してしまう


アセンブリ言語の質問を書かれるのであれば、プラットフォームをきちんと明記しておいた方がいいでしょう。同じx86系のCPUを使っていてもシステムコールの書き方などはガラリと変わってきます。

ここでは、`int $0x80`を使っているのでLinuxである可能性が高いと言うことで、その前提で回答を書いておきます。

今Linux用のアセンブリを動かせる環境がないので他にも修正すべき点があるかもしれませんが、少なくとも`print:`周りは次のように修正する必要があります。

[code]

    print:
        movl 4(%esp), %ecx
        movl $1, %ebx
        movl $1, %edx
    write:
        cmpb $0x00, (%ecx)
        je ret_func
        movl $4, %eax ;<-システムコール番号は、`int $0x80`の直前で毎回設定
        int $0x80
        incl %ecx
        jmp write
    
    ret_func:
        ret
    
[/code]

Linuxのシステムコールでは結果がeaxに帰ってくるので、その内容は`int
$0x80`の前後で変わってしまいます。eaxに設定するシステムコール番号は、毎回`int $0x80`の直前で設定しなおしてください。


CC BY-SA 3.0
2016-09-03T12:29:40.487
28670
2016-09-03T12:29:40.487
13972
28668
answer