由题构造 嵌入汇编(汇编)
小明是一个渔夫,坚持“三天打鱼,两天晒网”。已知今年有365天,1月1日小明去打3天鱼,1月4号开 始晒2天网。
编写程序让用户输入今年的第几天,输出当天小明是打鱼还是晒网,打鱼输出“F”,筛网输出“D”, 如果输入的天数不正确则输出“E”。例如输入5,程序输出“D”;输入6,程序输出“F”;输入366输出“E”。
设有如下C程序框架,请采用嵌入汇编形式编写所需的程序片段,其中判断打鱼还是筛网的部分需采用子程 序形式实现。请在必要的位置进行注释。
#include <stdio.h>int main()
{ unsigned int n = 0; char result[2] = " "; // 用于保存输出结果,预留足够空间printf("请输入第几天(1~365):\n"); scanf("%d", &n); // 嵌入汇编主逻辑_asm {mov eax, n ; 将输入的天数存入eaxcmp eax, 1 ; 检查是否小于1jl invalid_day ; 如果小于1,跳转至无效处理cmp eax, 365 ; 检查是否大于365jg invalid_day ; 如果大于365,跳转至无效处理; 有效天数,调用判断子程序call judge_fish_or_dryjmp output_result ; 跳转到结果invalid_day:; 无效天数,设置结果为'E'mov byte ptr [result], 'E'jmp exit_asm ; 退出汇编块output_result:; 将子程序返回的结果存入resultmov byte ptr [result], alexit_asm:; 汇编块结束} printf("结果:%s\n", result); return 0;
}// 判断打鱼还是晒网的子程序,使用嵌入汇编实现
_asm {
judge_fish_or_dry:; 功能:判断给定天数是打鱼还是还是晒网; 输入:eax = 天数(n); 输出:al = 'F'(打鱼)或'D'(晒网); 计算(n-1) % 5,因为周期是5天(3天打鱼+2天晒网)dec eax ; eax = n-1,将天数转为0基索引; 计算模5运算mov ecx, 5xor edx, edx ; 清空edx,准备除法div ecx ; edx = (n-1) % 5,eax = 商(无用); 判断余数范围cmp edx, 2 ; 余数0,1,2对应打鱼(3天)jle is_fishing ; 如果小于等于2,跳转至打鱼处理jmp is_drying ; 否则为晒网(余数3,4对应2天)is_fishing:mov al, 'F' ; 设置结果为打鱼jmp return_funcis_drying:mov al, 'D' ; 设置结果为晒网return_func:ret ; 返回主程序
}