【发布时间】:2018-10-04 16:20:54
【问题描述】:
我的任务是编写一个可以从 C 中读取并声明如下的汇编例程:
extern int solve_equation(long int a, long int b,long int c, long int *x, long int *y);
找到方程的解
a * x + b * y = c
在-2147483648 <x, y <2147483647 中检查所有选项。
如果找到解决方案,从例程返回的值将是 1,另一个是 0。
您必须考虑到计算结果:a * x, b * y, a * x + b * y 可以超过 32 位。
.MODEL SMALL
.DATA
C DQ ?
SUM DQ 0
MUL1 DQ ?
MUL2 DQ ?
X DD ?
Y DD ?
.CODE
.386
PUBLIC _solve_equation
_solve_equation PROC NEAR
PUSH BP
MOV BP,SP
PUSH SI
MOV X,-2147483648
MOV Y,-2147483648
MOV ECX,4294967295
FOR1:
CMP ECX,0
JE FALSE
PUSH ECX
MOV Y,-2147483648
MOV ECX,4294967295
FOR2:
MOV SUM,0
CMP ECX,0
JE SET_FOR1
MOV EAX,DWORD PTR [BP+4]
IMUL X
MOV DWORD PTR MUL1,EAX
MOV DWORD PTR MUL1+4,EDX
MOV EAX,DWORD PTR [BP+8]
IMUL Y
MOV DWORD PTR MUL2,EAX
MOV DWORD PTR MUL2+4,EDX
MOV EAX, DWORD PTR MUL1
ADD DWORD PTR SUM,EAX
MOV EAX, DWORD PTR MUL2
ADD DWORD PTR SUM,EAX
MOV EAX, DWORD PTR MUL1+4
ADD DWORD PTR SUM+4,EAX
MOV EAX, DWORD PTR MUL2+4
ADD DWORD PTR SUM+4,EAX
CMP SUM,-2147483648
JL SET_FOR2
CMP SUM,2147483647
JG SET_FOR2
MOV EAX,DWORD PTR [BP+12]
CMP DWORD PTR SUM,EAX
JE TRUE
SET_FOR2:
DEC ECX
INC Y
JMP FOR2
SET_FOR1:
POP ECX
DEC ECX
JMP FOR1
FALSE:
MOV AX,0
JMP SOF
TRUE:
MOV SI,WORD PTR [BP+16]
MOV EAX,X
MOV DWORD PTR [SI],EAX
MOV SI,WORD PTR [BP+18]
MOV EAX,Y
MOV DWORD PTR [SI],EAX
MOV AX,1
SOF:
POP SI
POP BP
RET
_solve_equation ENDP
END
这是处理大数的正确方法吗?
当我尝试这样做时,我得到了操作或指令has illegal size 的参数:
MOV SUM,0
CMP SUM,-2147483648
CMP SUM,2147483647
主要代码:
int main()
{
long int x, y, flag;
flag = solve_equation(-5,4,2147483647,&x, &y);
if (flag == 1)
printf("%ld*%ld + %ld*%ld = %ld\n", -5L,x,4L,y,2147483647);
return 0;
}
输出
-5*-2147483647 + 4*-2147483647 = 2147483647
我正在使用 dosbox 0.74 和 tcc
【问题讨论】:
-
请注意,即使在 asm 中,这也可能需要一些时间才能运行。很长一段时间。
-
看起来像一个混合源程序(TurboC 和 TASM?)。请添加适当的标签并描述您使用的版本。显示主程序。参数列表(
int c! int*x ,int*y!)是老师确定的吗? -
@rkhb 是的,老师确定的参数列表,我做了彼得说的改变,它起作用了。