题解 P1046 【陶陶摘苹果】
officeyutong
2018-03-19 10:12:47
你们这些dalao好强啊qwq
蒟蒻只能用asm写个小程序了..
基本思路跟那些用c或者cpp或者pascal的代码是一样的,但是我用了汇编实现的而已
```cpp
#include <stdio.h>
extern "C" volatile int read() {
int val;
scanf("%d", &val);
return val;
}
extern "C" volatile void write() {
int x;
asm("mov %%edx,%0" : "=r"(x)::"edx");
printf("%d\n", x);
}
int arr[10];
int main(void) {
//ebx 循环计数器 rcx 指针 eax 身高 r9结果计数器
asm(
//初始化变量
"mov $0,%%ebx\n\t"
"mov %[arr],%%rcx\n\t"
"l0_begin:\n\t"
//函数调用前 先把用到的寄存器压栈
"push %%rax\n\t"
"push %%rcx\n\t"
"call read\n\t"
"pop %%rcx\n\t"
//接收返回值
"mov %%eax,(%%rcx)\n\t"
"pop %%rax\n\t"
//直接把高度减掉30
"sub $30,(%%rcx)\n\t"
//加上4的内存偏移 以便存储下一个数据
"add $4,%%rcx\n\t"
//循环计数器增加
"inc %%ebx\n\t"
//判断循环边界
"cmp $10,%%ebx\n\t"
//循环计数器>=10 跳出
"jge l0_end\n\t"
"jmp l0_begin\n\t"
"l0_end:\n\t"
//输入身高并存放在eax
"call read\n\t"
::[arr]"r"(arr) : "rax", "rbx", "rcx");
//edx 结果计数器
asm(
//初始化变量
"xor %%edx,%%edx\n\t"
"xor %%ebx,%%ebx\n\t"
"mov %[arr],%%rcx\n\t"
"l1_begin:\n\t"
//判断是否成立
"cmp (%%rcx),%%eax\n\t"
"jge bigger\n\t"
"jmp bt\n\t"
"bigger:\n\t"
"inc %%edx\n\t"
"bt:\n\t"
"add $4,%%rcx\n\t"
//增加循环计数器并判断边界
"inc %%ebx\n\t"
"cmp $10,%%ebx\n\t"
"jge l1_end\n\t"
"jmp l1_begin\n\t"
"l1_end:\n\t"
//输出结果
"call write"
::[arr]"r"(arr) : "rax", "rbx", "rcx", "rdx");
return 0;
}
```