Я использую Intel x86 для программирования на ассемблере.У меня есть две переменные (int), и я хочу, чтобы функция ассемблера возвращала наибольшее значение.Я вызываю функцию ассемблера с помощью программы на C, и у меня это есть в main (), function (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.Например, функция (1,5) возвращает «1» вместо «5».
Я не понимаю, почему результат неправильный.
РЕДАКТИРОВАТЬ: Благодаря вашейОтветы, я изменил программу благодаря вашему совету:
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
, это правильно?Работает нормально.
Кроме того, как я могу улучшить этот код?Я использую переменные, потому что целью будет иметь три числа и найти среднее.