S3C2440c语言汇编传参点灯

这篇博文讨论调用者怎么传参数给被调用者

目录

    • 编写代码
    • 现象
    • 反汇编分析

编写代码

led.c

void delay(volatile int d)
{
	while (d--);
}

int led_on(int which)
{
	unsigned int *pGPFCON = (unsigned int *)0x56000050;
	unsigned int *pGPFDAT = (unsigned int *)0x56000054;

	if (which == 4)
	{
		/* 配置GPF4为输出引脚 */
		*pGPFCON = 0x100;
	}
	else if (which == 5)
	{
		/* 配置GPF5为输出引脚 */
		*pGPFCON = 0x400;
	}
	
	/* 设置GPF4/5输出0 */
	*pGPFDAT = 0;

	return 0;
}

为了保险,为delay加上volatile。
不让编译器优化,编译器可能发现delay没做任何事情,从逻辑上看省略它没有任何关系,于是会自作主张优化掉。

start.S

.text
.global _start

_start:

	/* 设置内存: sp 栈 */
	ldr sp, =4096  /* nand启动 */
//	ldr sp, =0x40000000+4096  /* nor启动 */

	mov r0, #4 //将4传给led_on
	bl led_on

	ldr r0, =100000//将此数传给delay
	bl delay

	mov r0, #5//将5传给led_on
	bl led_on

halt:
	b halt

makefile

all:
	arm-linux-gcc -c -o led.o led.c
	arm-linux-gcc -c -o start.o start.S
	arm-linux-ld -Ttext 0 start.o led.o -o led.elf
	arm-linux-objcopy -O binary -S led.elf led.bin
	arm-linux-objdump -D led.elf > led.dis
clean:
	rm *.bin *.o *.elf *.dis

现象

S3C2440汇编传参点灯

最后程序会复位,重新执行,下一篇博文讲解原因

反汇编分析

S3C2440c语言汇编传参点灯_第1张图片
在start.S中,我们将10000存放在r0中。此处是将r0取出来

0x34、0x35
是将r0的值存放在fp -16的地方,再取出来读到r3

0x3c
r3减1

后面把r3再存回去,再读

0x48
是将r3和1比较,对应C语言代码为
while(d–);

这个C函数中用到了汇编传来的值,就是这两个函数的形式参数

你可能感兴趣的:(汇编相关,S3C2440,裸机相关,S3C2440,JZ2440,C语言,汇编,反汇编)