;代码转换
include irvine32.inc
.data
dat word 10 dup(?) ;对于这个参数设计模式不太明白
p word 10 dup(?)
no word ?
.code
main proccall inputpush lengthof datpush offset datcall judgecall outputexitmain endpinput proc ;子程序:输入数组push esipush ecxpush ebxpush eaxmov ebx,offset datmov ecx,10xor esi,esistart: cmp ecx,0jz done1xor eax,eaxcall readint ;这种输出模式每输入一个数都要换行mov dat[esi*2],axinc esidec ecxjmp startdone1: pop eaxpop ebxpop ecxpop esiret
input endpjudge proc ;子程序:判断一个数组中的所有偶数并存放;入口参数:顺序压入数据个数 数据偏移地址push ebp ;将ebp入栈mov ebp,esp ;esp放入ebp中进行操作push ebxpush edipush eaxpush ecxpush edx ;保护寄存器mov ebx,[ebp+8] ;堆栈中取出的偏移地址mov ecx,[ebp+12];堆栈中取出数组个数xor esi,esi ;控制dat数组xor edi,edi ;控制p数组start1: cmp ecx,0jz done3xor edx,edxxor eax,eaxmov dx,[ebx+esi*2]mov ax,dxand dx,01hcmp dx,01hjz oddmov p[edi*2],axinc edi
odd: dec ecxinc esijmp start1done3: mov no,dipop edxpop ecxpop eaxpop edipop ebxpop ebpret 8 ;因为主程序压入两个参数,使用堆栈区8个字节
judge endp ;返回一个数组output proc ;子程序:数组输出程序;参数:相关待输出数组xor esi,esixor ecx,ecxmov ecx,dword ptr noxor eax,eaxmov eax,ecxcall writeintcall crlfha6: cmp ecx,0jz done3xor eax,eaxmov ax,p[esi*2]call writeintcall crlfinc esidec ecxjmp ha6
done3: ret
output endp ;无输出end main ;汇编结束
;总结:堆栈传递参数和其他的区别
;提前将数组的数量和偏移量入栈
;在最后要ret 8用于平衡堆栈
;其余的操作没有什么不一样
本文发布于:2024-02-01 01:15:19,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170672132132778.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |