アセンブラーのプログラミングには Intel x86 を使用しています。2 つの変数 (int) があり、アセンブラー関数が最大のものを返すようにします。私は C プログラムでアセンブラ関数を呼び出し、これを main() 関数 (1,5) に入れました。
アセンブラコードは次のとおりです。
.globl function
.data
var1: .long 0
var2: .long 0
.text
function:
movl 4(%esp), %eax
movl 8(%esp), %ebx
cmp %eax, %ebx
jg cond1 /*greater, if a < b */
jl cond2 /*lower, if a > b */
movl var2, %eax
ret
cond1:
movl %eax, var1 /*var1 = a */
movl %ebx, var2 /*var2 = b */
ret
cond2:
movl %eax, var2 /*var2 = a*/
movl %ebx, var1 /*var1 = b */
ret
最大数は %eax (movl var2, %eax) になります。問題は、関数が常に %eax で最初の数値を返すことです。たとえば、function(1,5) は "5" ではなく "1" を返します。
結果が間違っている理由がわかりません。
編集:あなたの返信のおかげで、私はあなたのアドバイスのおかげでプログラムを修正しました:
function:
movl 4(%esp), %eax
movl 8(%esp), %ebx
cmp %eax, %ebx
jg cond1 /*greater, if a < b */
jl cond2 /*lower, if a > b */
next:
movl var2, %eax
ret
cond1:
movl %eax, var1 /*var1 = a */
movl %ebx, var2 /*var2 = b */
jmp next
cond2:
movl %eax, var2 /*var2 = a*/
movl %ebx, var1 /*var1 = b */
jmp next
に戻るにfunction()
は を使用しますjmp
が、正しいですか? それは正常に動作します。
また、このコードを改善するにはどうすればよいですか? 変数を使用するのは、目的が 3 つの数値を持ち、中央値を見つけることだからです。