汇编——多模块程序设计(主模块)

来源:互联网 发布:程序员用什么笔记本 编辑:程序博客网 时间:2024/06/06 17:23

⑵ 编写一个计算Z=(X2+Y4)的汇编语言主模块,其中X2、Y4通过调用⑴中的Nm实现,并显示当X=5,Y=6时的结果。显示格式为:

X=5,Y=6,Z=  

;主程序.386.modelflat,stdcalloptioncasemap:noneincludelibmsvcrt.libprintfPROTO C:dword, :varargscanfPROTO C :dword, :varargpublicresultMulProcPROTO stdcall :ptr dword, :sdword, :ptr dword, :ptr dword; 自定义函数 参数分别为    N    M N的M次方的长度 N的长度.dataresultbyte 2010 dup(0)res1byte 2010 dup(0); 存X的2次方的逆序数res2byte 2010 dup(0); 存Y的4次方的逆序数res3byte 2010 dup(0); 存Z的逆序数Msg1byte 'Please Input X',0ah,0Msg2byte 'Please Input Y',0ah,0Msgkbyte ', ',0Msgxbyte 'X=',0Msgybyte 'Y=',0Msgrbyte 'Z=',0szinbyte '%c',0Xbyte 1005 dup(0)Ybyte 1005 dup(0)IXdword 0; X的临时变量 放X字符串中某个字符的地址IYdword 0; Y的临时变量 放Y字符串中某个字符的地址lenXdword 0; X的幂长度-1lenY dword 0; Y的幂长度-1lenZdword 0; Z的长度-1lenxsdword 0; X的长度(s表示src 没改变过的X)-1lenysdword 0; Y的长度(s表示src 没改变过的Y)-1nousebyte  0.codemainproc C; 提示输入Xinvokeprintf,offset Msg1; 输入X 字符数组 正序存放mov esi,0inX:lea eax,X; 把X的地址放到eaxadd eax,esimov IX,eaxinvoke scanf,offset szin,IXmov al,byte ptr [X+esi]inc esicmp al,0ahjnz inX; 对输入的正数负数区别传参mov al,byte ptr Xcmp al,'-'jz fuxinvokeMulProc,offset X,2,offset lenX,offset lenxsjmp tpfuxfux:invokeMulProc,offset X+1,2,offset lenX,offset lenxstpfux:; 输出X幂长度-1;invoke printf,offset Msgl,lenX; 把result字符数组 倒序复制到 res1数字数组 则res1倒序mov edi,lenXmov esi,0xor eax,eaxlp1:mov al,byte ptr result[edi]sub al,'0'mov byte ptr res1[esi],alinc esidec edicmp edi,0jnl lp1; 输出res1 没有用 一会就删;mov esi,0;mov ebx,lenX;outr:;xor eax,eax;mov al,byte ptr res1[esi];invoke printf,offset szin,eax;inc esi;cmp esi,ebx;jng outr; 提示输入Yinvoke  printf,offset Msg2; 输入Y 字符数组 正序存放mov esi,0inY:lea eax,Y; 把Y的地址放到eaxadd eax,esimov IY,eaxinvoke scanf,offset szin,IYmov al,byte ptr [Y+esi]inc esicmp al,0ahjnz inY; 对输入的正数负数区别传参mov al,byte ptr Ycmp al,'-'jz fuyinvokeMulProc,offset Y,4,offset lenY,offset lenysjmp tpfuyfuy:invokeMulProc,offset Y+1,4,offset lenY,offset lenystpfuy:; 输出Y幂长度-1;invoke  printf,offset Msgl,lenY; 把result字符数组 倒序复制到 res2数字数组 则res2倒序mov edi,lenYmov esi,0xor eax,eaxlp2:mov al,byte ptr result[edi]sub al,'0'mov byte ptr res2[esi],alinc esidec edicmp edi,0jnl lp2; 输出res2;mov esi,0;mov ebx,lenY;outr1:;xor eax,eax;mov al,byte ptr res2[esi];invoke printf,offset szin,eax;inc esi;cmp esi,ebx;jng outr1; 输出结果 X = ?invoke printf,offset Msgxmov esi,0mov ebx,lenxs; 用ebx暂时存X的长度; 如果是负数 则把ebx的值加一mov al,byte ptr Xcmp al,'-'jz jlenxsjmp bjlenxsjlenxs:inc ebxbjlenxs:outr1:xor eax,eaxmov al,byte ptr X[esi]invoke printf,offset szin,eaxinc esicmp esi,ebxjng outr1; esi小于等于0 带符号比较; 输出逗号空格invoke printf,offset Msgk; 输出结果 Y = ?invoke printf,offset Msgymov esi,0mov ebx,lenys; 用ebx暂时存Y的长度; 如果是负数 则把ebx的值加一mov al,byte ptr Ycmp al,'-'jz jlenysjmp bjlenysjlenys:inc ebxbjlenys:outr2:xor eax,eaxmov al,byte ptr Y[esi]invoke printf,offset szin,eaxinc esicmp esi,ebxjng outr2; esi小于等于0 带符号比较; 令lenZ = lenX,lenY中大的一个mov eax,lenXmov ebx,lenYcmp eax,ebxja mvl; eax高于(无符号比较)ebx 跳到mvlmov lenZ,ebx; 将ebx的值给lenZjmp nomvl:mov lenZ,eax; 将eax的值给lenZno:; 输出lenZ;invoke printf,offset plenz,lenZ; 将res1 res2 相加mov esi,0; esi是数组下标loopplus:xor eax,eaxxor ebx,ebxmov al,byte ptr res1[esi]mov bl,byte ptr res2[esi]add al,bl; 将res1 res2对应位相加 存al中mov bl,byte ptr res3[esi]add al,bl; 将al res3对应位相加 存al中mov dl,aladd dl,'0'; 将所得数字转换成字符形式mov byte ptr res3[esi],dl; 将字符存在res3对应位cmp al,10; 将al和10比较 大于等于10则处理jb nodoifmov cl,10div cl; 商al 余数ahmov dl,ahadd dl,'0'; 将余数转换为字符mov byte ptr res3[esi],dl; 更新res3对应位 直接覆盖mov cl,byte ptr res3[esi+1]add al,cl; 商加下一位 再存回去mov byte ptr res3[esi+1],alnodoif:inc esi; 数组下标自增 代表本位处理完毕cmp esi,lenZjna loopplus; esi低于等于lenZ 则循环 (无符号数比较)invoke printf,offset Msgk; 输出 Z = ?invoke printf,offset Msgrmov esi,lenZ; 因为res3中存的是Z的逆序 则需要逆序输出xor eax,eaxinc esi; esi加一 看结果的最高位是否是进位产生位mov al,byte ptr res3[esi]cmp al,0; 不等于0则说明是进位 将其输出jz nothinadd al,'0'invoke printf,offset szin,eaxnothin:mov esi,lenZ; 循环输出Zp:xor eax,eaxmov al,byte ptr res3[esi]invoke printf,offset szin,eaxdec esicmp esi,0jnl p; 带符号比较 因为可能产生负数; system pauseinvoke scanf,offset szin,offset nouseretmainendpend


原创粉丝点击