• 締切済み

GASアセンブラのテストプログラムの作り方について

現在、アセンブラのテストプログラムの作り方に困っています。 入力された値を関数palindへ渡し、結果を出力する様にしたいのですが、考え方がよく解りません。 関数を呼び出すには、       movl 引数, %eax       pushl %eax       call 渡す関数の名前       popl %eax とすると思うのですが、これだけでは結果を戻しただけだになると思います。 この後結果を出力するにはどのようにしたら良いでしょうか? 宜しくお願いしますm(_ _)m ・回文を作るアセンブラの関数(palind.s) 例えば8と入力した場合に2進数(1000)の回文(上から読んでも下から読んでも同じもの)、10000001と00011000を作ります。(abcd)→(abcddcba),(dcbaabcd) 答えは2個あるので、入力とは別の変数を持ってきて、その変数の値によってどちらかを返すようにします。 (2個の答えを出すには変数を変えて呼び出せば問題ないと思います)

noname#190358
noname#190358

みんなの回答

  • shred
  • ベストアンサー率35% (25/70)
回答No.1

確認なんですがそのプログラムはOSの上で動かすのか 実機の上で動かすのかどちらですか。 後者であればPC/AT互換機の仕様について調べなければいけません。 前者で且つ端末または擬似端末に出力するのであれば writeシステムコール(4番)を発行するだけです。

noname#190358
質問者

お礼

前者であり、そのまま出力すれば良いところまでは解ったのですが、 どうも戻り値の表示が正しくされません。 もう少し考えてみようと思います。有難う御座いました。

関連するQ&A

  • アセンブラの読み方

    お世話になります。 アセンブラを勉強しています。 下記について教えていただけないでしょうか。 よろしくお願いいたします。 1 .file 2 .data 3 var: .long 0x1234 4.text 5 .global main 6 main: 7 movb $1, %al // 値1をレジスタalに代入 8 push %eax // レジスタeaxの内容をスタックに格納 9 call IncReg // 関数呼び出し 10 pop %eax // スタックからレジスタeaxに引き出し 11 push var // 変数varの内容をスタックに格納 12 call IncReg // 関数呼び出し 13 pop %ecx // スタックからレジスタecxに引き出し 14 ret // リターン 15 IncReg: 16 movl %esp, %ebp // pushによって動いたスタックの先頭アドレスをレジスタ ebp に代入 17 movl 4(%ebp), %edx // mainから渡された eax(var) の値をレジスタ edx に代入 18 incw %edx // レジスタ edx の値を2増やす 19 movl %edx, 4(%ebp) // 2増やしたものを引数のあるスタックの場所に代入 20 ret // リターン (質問) 7 でレジスタ al に 1 を代入したのは何か意味があるのでしょうか。 17 の4(%ebp)はスタックポインタの1つ下、つまりmainから渡された引数でよろしいでしょうか。 18 の incw %edx はレジスタ edx の値を 2 増やすという意味でよろしいでしょうか。 13 でレジスタ ecx の値は 1236 になるので正しいでしょうか。

  • アセンブラ初心者です。

    アセンブラ初心者です。 MacOs上のターミナルでgccをつかいアセンブラのソースコードを表示させてみたら .cstring LC0: .ascii "%d \0" .text .globl _main _main: pushl %ebp movl %esp, %ebp pushl %ebx subl $36, %esp call L9 "L00000000001$pb": L9: popl %ebx movl $1, -16(%ebp) jmp L2 L3: movl $1, -12(%ebp) jmp L4 L5: movl -16(%ebp), %eax imull -12(%ebp), %eax movl %eax, 4(%esp) このようになったのですが1つ疑問があります。それはjmp命令のところでjmp L2またはjmp L4とありますがL2とL4のソースコードは表示されていません....。この部分はどうして表示されないのでしょうか?またどのようになっているのでしょうか?教えてください><ちなみにfor文をつかった単純なかけ算のプログラムをCで書きました。

  • 変数など厳密なプログラムが書きたいのですが、どうすればよいでしょうか?

    PHPで関数の引数に渡すとき、以下のように$aaを$aとしてしまった場合に 関数内の$idは値がありませんが、関数内でこれを検出することができるのでしょうか? Perlなら use strict;とし、my等で定義されていない変数はすべて警告表示されますが、PHPはスルーです。 変数など厳密なプログラムが書きたいのですが、どうすればよいでしょうか? $aa = 1; test($a) function test($id){ ... }

    • ベストアンサー
    • PHP
  • 3つほどプログラムをおしえてください。

    (1)100までの整数をいくつか入力し、10刻みでの個数を表示し、負の数が入力されると整数の入力を終わるプログラムです。各範囲の個数は配列に格納する。 実行結果 65 30 21 95 5 -1 0--- 9 : 1 10--- 19 : 0 20--- 29 : 1 30--- 39 : 1 40--- 49 : 0 50--- 59 : 0 60--- 69 : 1 70--- 79 : 0 80--- 89 : 0 90---100 : 1 (2)数字の文字列を入力し、その文字列に含まれる各数字(文字)'0','1',~'9'の個数を表示するプログラムの作成。 実行結果 1231234567 0: 0 1: 2 2: 2 3: 2 4: 1 5: 1 6: 1 7: 1 8: 0 9: 0 (3) 変数xは、0~1までの0.01刻みの値(101個)を取るとする。このとき、2次関数 f(x)=3x^2+2x+1の値が2.0<f(x)<3.0となるxの値をの個数を求めるプログラムの作成。ただし、xを引数としf(x)の値を返す関数を作成して、それを使用する。 実行結果 number=21 やってるうちにわけがわからなくなってしまいます。どなたかよろしくおねがいします。

  • プログラムの組み方が分かりません。

    ある課題で以下の問題が出題されました。 >>>> 2つのint型変数x,yにキーボードから値を入力し、その大小を判定する関数funcを作成せよ。この課題では、大きいと判定された数が代入された変数のアドレスがmain関数に戻されるものとする。 ============ #include<stdio.h> int *func(int *a,int *b) { /* 2つの値の大小判定を行い、アドレスを返す */ } main(void) { int x, y, *z; /* 変数 x,yにキーボードからデータを入力する */ /* 関数funcの呼び出し */ /* 変数zを用いて値の出力を行う */ } ============ <<<< 2行目の*funcというように、関数の頭に*が付くプログラムは初めてで、 どういう意味かもさっぱりわかりません。 それも含め、この問題はどういう風解けばいいのか、教えてください。 お願いします。

  • プログラムについてです。

    main関数内でキーボードから入力された2つの整数について、その整数値の和差乗除をユーザ定義関数shisoku()内で計算し、main関数内で結果を出力するプログラムを作成せよ。 ただし、すべて局所変数で構成し、大域変数を使ってはならない。 僕は和差、乗除はできるんですが和差乗除ができません。

  • アセンブラでコマンドライン引数を取得する方法

    50歳からアセンブラプログラムを趣味で勉強しております。 一つ壁に当たりました。 コマンドライン引数が何処にあるのかわかりません。 Windows7で nasm -fwin32 test.asm alink -oPE -subsys console test.obj crtdll.lib -entry start アセンブル、リンクしています。 test.asm extern printf section .text global _start _start: push ebp mov ebp,esp mov eax,[ebp+8] push eax mov eax,A101 push eax call printf add esp,8 pop ebp ret section .data A101: db 'argc = %d', 10, 0 で、argc = 2147340288 と表示されます。 どうぞよろしくお願いいたします。

  • マクロアセンブラの仕様について

    以下のコードは、C言語でfmodを呼び出したものです。 include <sunmath.h> #include <math.h> #include <stdio.h> #include <stdlib.h> int main (int argc,char **argv) { double wk_mod; double wk_data = 40000000000.0; wk_mod = fmod(wk_data,(double)10); return 0; } -------------------------------- これをアセンブラに展開するとfmodの行は以下のようになりました。 / Line 9 movsd .L_cseg1, %xmm1 movsd -40(%rbp), %xmm0 movl $2, %eax call fmod movsd %xmm0, -48(%rbp) movsd -48(%rbp), %xmm0 movl $0, %eax movsd %xmm0, -32(%rbp) ----------------------------- ここで、fmodの第1引数は%xmm0、第2引数は%xmm1経由で、渡されると推測していますが、この裏付けをとりたいために、callを行ったときの パラメータの渡し方が記述されている資料を探しています。 もしご存じの方がおりましたら教えて下さい。 OS sloaris10(x86) sun-studio11のCコンパイラで64ビットモードで-Sオプションでコンパイルを行いました。

  • プログラムの考え方。

    コマンドラインから引数を入力してお金の種別に分類せよ。(2000円札は考えない) main関数ではコマンドラインからの引数を判断し、引数の数や値がおかしいときにはエラーメッセージを表示する。正しいときはsyubetu関数にデータを渡してその結果を表示する。 syubetu関数は以下のとおりである。 ・関数名 syubetu ・引数 金額 money(int) 金種格納 kinsyu(int*) ・戻り値 なし ・機能 金額、金種格納用ポインタを引数とし、金種ごとの枚数を計算する関数 こういう問題があって、 コマンドラインの引数に数字を入力したら 一万円札から順番に何枚あるかの種別に分けるプログラムなんですが、 その分類をどうやってさせていいのかがわかりません。 例えば13531とかいれたら 一万円 一枚 5千円 0枚 千円 3枚 5百円 1枚 百円 0枚 50円 0枚 10円 3枚 5円 0枚 1円 1枚 っと表示させます。 この分類のところはどのように考えたらプログラムできるでしょうか? フローチャートを考えている途中なのですが、いまいち考え方がわかりません。 よろしくおねがいします。

  • ASPからexeプログラムへ引数

    ASPの超初心者です。 IIS上のASPから WWWから変数での文字列を test.exeに、引数を与えて実行することは可能ですか? また、それを実行した結果をASPでWWWに表示させたいの ですが、可能ですか? よろしければ、簡単な方法や関数等を教えてくだされば 幸いです。 よろしくお願いします。

専門家に質問してみよう