利用汇编和C混合编程,设计代码完成求a,b,c中最大值功能,要求写出汇编启动代码和C代码

如题所述

第1个回答  2016-06-25
;本程序限定A、B最多4位十进制数;本程序通过编译,运行正确CodeSegmentAssumeCS:Code,DS:CodeCRequ000DHLFequ000AHKBBackequ0008H;-----------------------------------------;功能:显示指定地址(Str_Addr)的字符串;入口:;Str_Addr=字符串地址(要求在数据段);用法:OutputStr_Addr;用法举例:OutputPromptStrOutputMACROStr_Addrleadx,Str_Addrmovah,9int21hEndM;-----------------------------------------;功能:取光标位置;入口:无;出口:DH=行号,DL=列号GetCursorProcNearPUSHAXPUSHBXPUSHCXXORBX,BXMOVAH,3INT10HMOVCursor_Row,DHMOVCursor_Col,DLPOPCXPOPBXPOPAXRETCursor_RowDB?Cursor_ColDB?GetCursorEndP;-----------------------------------------;功能:置光标位置;入口:Cursor_Row=行坐标;Cursor_Col:列坐标)SetCursorProcNearPUSHCXPUSHBXPUSHAXMOVDH,Cursor_RowMOVDL,Cursor_ColXORBX,BXMOVAH,2INT10HPOPAXPOPBXPOPCXRETSetCursorEndP;-----------------------------------------;功能:输出回车换行enter_CTLFprocNearpushaxpushdxmovah,02hmovdl,0dhint21hmovdl,0ahint21hpopdxpopaxretenter_CTLFendp;-----------------------------------------;功能:输出一个字符;入口:dl=要显示的字符enter_ChrprocNearpushaxmovah,02hint21hpopaxretenter_Chrendp;-----------------------------------------;功能:键盘输入一个N位的十进制数字,;用逻辑和移位指令将其转换成二进制数并保存在指定的内存单元。;入口:N=数字位数;di=保存输入的数字首地址;出口:转换后的二进制数保存在di所指的单元Input_DigitProcNearpushdxpushcxpushbxpushdileadi,@@Save_Tmppushdicldmovcx,Npushcx@@Input:callGetCursor;取光标位置movah,1;从键盘接受一个字符int21hcmpal,CR;若键入的是回车,已经键入的数字不足N位jz@@ASC_Dec;转去处理已经键入的数字cmpal,KBBackjz@@KB_Back;若是回空键,重新输入cmpal,'0'jb@@KBBack;若低于数字'0',重新输入cmpal,'9'ja@@KBBack;若低于数字'9',重新输入jmp@@Save_Dig@@KB_Back:decCursor_Colinccxdecdi@@KBBack:callSetCursor;置光标位置jmp@@Input@@Save_Dig:andal,0fh;转换成二进制数stosb;保存loop@@Input;接受下一个数字@@ASC_Dec:movax,cxpopcxpopsisubcx,ax;实际输入的数字位数xorbp,bpxordx,dxxorax,axjcxz@@Save_Ret;若直接回车,没有输入任何数字,按输入'0'处理deccx;实际输入的数字位数减1,准备把输入的这一串数字转换成二进制数jcxz@@One_Digit;若输入的数字只有一位,转去直接保存这个二进制数movbx,10@@Mul_Ten:lodsbcbwaddax,bpmulbxmovbp,axloop@@Mul_Ten@@One_Digit:lodsbcbwaddax,bp@@Save_Ret:popdistoswpopbxpopcxpopdxret@@Save_Tmpdb16dup(?)Input_DigitEndP;-----------------------------------------;功能:把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示;入口:AX=二进制数;出口:在当前光标位置显示转换后的ASCII码数字Dec_ASCIIProcNearpushdxpushbxpushdimovbx,10leadi,@@Temp_Save[6]movbyteptr[di],'$'decdicld@@Divide:xordx,dxdivbxordl,30hmov[di],dldecditestax,0ffffhjnz@@Divideincdipushdipopdxmovah,9int21hpopdipopbxpopdxret@@Temp_Savedb7dup(?)@@Carry_Yesdb'+'Dec_ASCIIEndP;-----------------------------------------Nequ4;输入的十进制整数位数Number1dw?Number2dw?prompt_Onedb'Pleasethefirstnumber:$'prompt_Twodb'Pleasethesecondnumber:$'Start:pushcspopdspushcspopes;使数据段、附加段与代码段同段;-----------------------------------------;输入两个十进制数Outputprompt_One;提示输入第一个数leadi,Number1;变量Number1的地址callInput_Digit;从键盘接受一个N位数字callenter_CTLF;输出一个回车、换行Outputprompt_Two;提示输入第一个数leadi,Number2;变量Number1的地址callInput_Digit;从键盘接受一个N位数字callenter_CTLF;输出一个回车、换行callenter_CTLF;输出一个回车、换行;-----------------------------------------;加法运算movax,Number1callDec_ASCII;把AX中的二进制有、无符号数转换成显式的十进制ASCII码,并送显示屏显示movdl,'+'callenter_Chr;显示一个加号movax,Number2callDec_ASCII;显示第二个数movdl,'='callenter_Chr;显示一个等号movax,Number1addax,Number2;Number1+Number2→AXcallDec_ASCII;显示和callenter_CTLF;输出一个回车、换行Exit_Proc:movah,4ch;结束程序int21hCodeENDSENDStart;编译到此结束
第2个回答  2016-06-25
电路如下,可否:追问

在哪里呢?