я новичок в ассемблере, и я пытаюсь написать ассемблерную функцию, которая реализует самую большую функцию dif в этом фрагменте кода c (она получает 3 целых числа в качестве аргументов).По сути, ему нужно найти минимум и максимум из 3 аргументов и затем вернуть вычитание между максимумом и минимумом:
#include <stdio.h>
extern int largestdif( int n1, int n2, int n3 );
int main( ) {
printf( "largestdif: %d\n", largestdif( 100, 30, 10 ) );
printf( "largestdif: %d\n", largestdif( 0, -1, 1 ) );
return 0;
}
Вот мой кусок кода в сборке, выглядит немного странно, но я надеюсь, что вы можете сказать,мне, что не так с этим, поскольку его ошибка ошибки сегментации представления.Я действительно понятия не имею, что делать, должно быть, это связано с тем, что регистры недостаточно вызываются.Кажется, я не могу понять ответ, так что я надеюсь, что кто-нибудь может мне помочь.заранее спасибо.
.global largestdif
.text
largestdif:
push %ebp
mov %esp, %ebp
mov 8(%ebp), %ebx
push %ebx
mov 12(%ebp), %ecx
push %ecx
mov 16(%ebp), %edx
push %edx
#compare n1 and n2 to find the largest number
cmp %edx, %ecx
jl n1_menor_n2
#block else
cmp %edx, %ebx #compare first and third numbers
jl firstlower
#bloco else
mov %edx, %eax #already have largest number
jmp continue
firstlower:
mov %ebx, %eax #already have largest number
jmp continue
n1_menor_n2:
cmp %ecx, %ebx #compare second and third numbers
jl secondlower
#block else
mov %ecx, %eax # already have largest
jmp continue
secondlower:
mov %ebx, %eax # already have largest
jmp continue
continue:
#compare n1 and n2 to find the largest number
cmp %edx, %ecx
jg n1_maior_n2
#block else
cmp %edx, %ebx
jg firstlarger
#block else
sub %edx, %eax
jmp continue2
firstlarger:
sub %ebx, %eax
jmp continue2
n1_maior_n2:
cmp %ecx, %ebx
jg secondlarger
#block else
sub %ecx, %eax
jmp continue2
secondlarger:
sub %ebx, %eax #already have the subtraction
jmp continue2
continue2:
pop %edx
pop %ecx
pop %ebx
mov %ebp, %esp
pop %ebp
ret