用主程序调用子程序形式,汇编语言编程实现n!=1!+2!+3!+4!+5!

用主程序调用子程序形式,汇编语言编程实现n!=1!+2!+3!+4!+5!,第1张

写一段能够计算x!并存回某寄存器,ret,然后在主程序里call它,返回后累加。

由于(1 !) + (2 !) + (3 !) + (4 !) + (5 !) = 153,大小小于机器字长,可直接存在寄存器里。

是因为你的c语言编译器是 32 位的 ,而你的汇编语言是 16 位的 ,连接当然有问题,就算没问题也是运行不起来的。

建议你换一个 32 位的汇编编译器 且用32位汇编指令编写 , 不过你得重新学一下 32位的汇编。

另外还有一种方法就是 使用VC 编写C语言 , 在C中直接用内联汇编。代码如下

__stdcall int fun()

{

int a;

__asm{

mov eax, [esi+4];

add eax, [esi+6];

mov a , eax;

}

return a;

}

int main(int argc, char argv[])

{

printf("Hello World!\n");

printf("%d\n",fun());

return 0;

}

汇编语言CALL是调用子程序指令,用法如下:

CALL

子程序名

参数的传递是通过调用者和被调用者的相互约定实现的。

在51汇编语言中CALL只能实现2K范围内的调用,大于这个限制就需要用到LCALL了。

比如:

ORG

0000H

LJMP

MAIN:

MAIN:

MOV

SP,#7FH

CALL

INIT

LOOP:

JNB

RI,$

CLR

RI

MOV

A,SBUF

MOV

SBUF,A

JB

TI,$

CLR

TI

SJMP

LOOP

INIT:

MOV

TMOD,#20H

;定时器1做波特率发生器

MOV

TH1,#0FDH

;波特率9600bps

MOV

TL1,#0FDH

MOV

SCON,#50H

;串口工作方式1,运行接受

SETB

TR1

RET

END

一、程序执行顺序不同

1、LCALL:LCALL是调用子程序,当子程序执行完后就返回到LCALL指令下一条指令继续执行程序

2、JMP:JMP是无条件转移指令,转移到某执行程序后就不再返到回原处,是一去不回返的。

二、程序处理方式不同

1、LCALL:指令在进行流程跳转前会保存返回地址,以便在跳转目标代码中可以使用ret指令返回到call指令的下一条指令处继续执行。执行段内跳转时,只保存EIP;如果是段间跳转,还保存CS。

2、JMP:进行执行流程的跳转,不会保存返回地址。

三、程序执行过程不同

1、LCALL:执行LCALL命令时,将当前的IP或CS和IP压入栈中,之后转移到紧跟的标号行地址执行程序。

2、JMP:JMP指令控制程序直接跳转到目标地址执行程序,程序总是顺序执行,指令本身无堆栈 *** 作过程。

以上就是关于用主程序调用子程序形式,汇编语言编程实现n!=1!+2!+3!+4!+5!全部的内容,包括:用主程序调用子程序形式,汇编语言编程实现n!=1!+2!+3!+4!+5!、在C语言中调用汇编语言子程序 程序连接失败、汇编语言 call怎么用等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9741006.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存