题解 P1046 【陶陶摘苹果】

officeyutong

2018-03-19 10:12:47

Solution

你们这些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; } ```