Win32汇编(SMU—子程序)

mac2024-08-16  60

编一函数MaxN(int a[],int n)用于求n个元素的数组a中的最大元素。 运行后输入: 1 3 4 5 2 则结果输出: 最大值为5 运行后输入: 1 3 6 4 5 2 则结果输出: 最大值为6 .386 ;选择的处理器 .model flat, stdcall ;存储模型,Win32程序只能用平展(flat)模型 option casemap:none ;指明标识符大小写敏感 include kernel32.inc ;要引用的头文件 includelib kernel32.lib ;要引用的库文件 includelib msvcrt.lib ;引用C库文件 scanf PROTO C:DWORD,:vararg ;C语言scanf函数原型声明 printf PROTO C:DWORD,:vararg ;C语言printf函数原型声明 .data ;⑤数据段 Infmt BYTE '%d',0 Outfmt BYTE '最大值为%d',0 a DWORD 80 Dup(0) ;定义数组a .code ;⑥代码段 ;**/ MaxN proc x:dword,y:dword mov esi,0 mov ebx,x mov eax,[ebx+esi*4] .while esi<y .if eax<[ebx+esi*4] mov eax,[ebx+esi*4] .endif inc esi .endw ret MaxN endp ;**/ start: ;定义标号start mov ESI,0 invoke scanf,ADDR Infmt,ADDR a[ESI*4];输入a[i]的值 .while EAX==1 INC ESI invoke scanf,ADDR Infmt,ADDR a[ESI*4]; .endw invoke MaxN,ADDR a,ESI ;求a数组和通过EAX返回 invoke printf,ADDR Outfmt,EAX;输出结果 invoke ExitProcess,0 ;退出进程,返回值为0 end start ;指明程序入口点start 编一函数MinN(int a[],int n)用于求n个元素的数组a中的最小元素。 运行后输入: 1 3 4 5 2 则结果输出: 最小值为1 运行后输入: 7 3 6 4 5 8 则结果输出: 最小值为3 .386 ;选择的处理器 .model flat, stdcall ;存储模型,Win32程序只能用平展(flat)模型 option casemap:none ;指明标识符大小写敏感 include kernel32.inc ;要引用的头文件 includelib kernel32.lib ;要引用的库文件 includelib msvcrt.lib ;引用C库文件 scanf PROTO C:DWORD,:vararg ;C语言scanf函数原型声明 printf PROTO C:DWORD,:vararg ;C语言printf函数原型声明 .data ;⑤数据段 Infmt BYTE '%d',0 Outfmt BYTE '最小值为%d',0 a DWORD 80 Dup(0) ;定义数组a .code ;⑥代码段 ;**/ MinN proc aa:dword,n:dword mov esi,0 mov ebx,aa mov eax,[ebx+esi*4] .while esi<n .if eax>[ebx+esi*4] mov eax,[ebx+esi*4] .endif inc esi .endw ret MinN endp ;**/ start: ;定义标号start mov ESI,0 invoke scanf,ADDR Infmt,ADDR a[ESI*4];输入a[i]的值 .while EAX==1 INC ESI invoke scanf,ADDR Infmt,ADDR a[ESI*4]; .endw invoke MinN,ADDR a,ESI ;求a数组和通过EAX返回 invoke printf,ADDR Outfmt,EAX;输出结果 invoke ExitProcess,0 ;退出进程,返回值为0 end start ;指明程序入口点start 编一串拷贝子程序,实现C语言char* strcpy(char *Dst,char *Src)函数, 然后主程序调用strcpy(s1,s2)实现s2串拷贝到s1串。 运行后输入: ABCD 则结果输出: ABCD .386 ;选择的处理器 .model flat, stdcall ;存储模型,Win32程序只能用平展(flat)模型 option casemap:none ;指明标识符大小写敏感 include kernel32.inc ;要引用的头文件 includelib kernel32.lib ;要引用的库文件 includelib msvcrt.lib ;引用C库文件 scanf PROTO C:DWORD,:vararg ;C语言scanf函数原型声明 printf PROTO C:DWORD,:vararg ;C语言printf函数原型声明 .data ;⑤数据段 fmt BYTE '%s',0 ;定义变量 s1 BYTE 80 Dup(0) s2 BYTE 80 Dup(0) .code ;⑥代码段 ;**/ strcpy proc x:dword,y:dword mov esi,y mov edi,x ;y -> x mov ecx,80 rep movsb ret strcpy endp ;**/ start: ;定义标号start invoke scanf,ADDR fmt,ADDR s2 ;输入s2的值 invoke strcpy,ADDR s1,ADDR s2 ;求s2串拷贝到s1串 invoke printf,ADDR fmt,ADDR s1 ;输出 invoke ExitProcess,0 ;退出进程,返回值为0 end start ;指明程序入口点start 编一串连接子程序,实现C语言char* strcat(char *Dst,char *Src)函数, 然后主程序调用strcat(s1,s2)实现s2串追加(连接)到s1串。 运行后输入: AB CD 则结果输出: ABCD .386 ;选择的处理器 .model flat, stdcall ;存储模型,Win32程序只能用平展(flat)模型 option casemap:none ;指明标识符大小写敏感 include kernel32.inc ;要引用的头文件 includelib kernel32.lib ;要引用的库文件 includelib msvcrt.lib ;引用C库文件 scanf PROTO C:DWORD,:vararg ;C语言scanf函数原型声明 printf PROTO C:DWORD,:vararg ;C语言printf函数原型声明 .data ;⑤数据段 fmt1 BYTE '%s %s',0 ;定义变量 fmt2 BYTE '%s',0 s1 BYTE 80 Dup(0) s2 BYTE 80 Dup(0) .code ;⑥代码段 ;**/ strcat proc x:dword,y:dword mov esi,y mov edi,x mov eax,0 .while byte ptr[edi]!=0 inc edi .endw .while byte ptr[esi]!=0 inc esi add eax,1 .endw cld mov esi,y mov ecx,eax rep movsb ret strcat endp ;**/ start: ;定义标号start invoke scanf,ADDR fmt1,ADDR s1,ADDR s2 invoke strcat,ADDR s1,ADDR s2 ;求s2串连接到s1串 invoke printf,ADDR fmt2,ADDR s1;输出 invoke ExitProcess,0 ;退出进程,返回值为0 end start ;指明程序入口点start 编一函数fun(int n)用于判断整数n是否是素数。 运行后输入: 5 则结果输出: 是素数 运行后输入: 4 则结果输出: 不是素数 .386 ;选择的处理器 .model flat, stdcall ;存储模型,Win32程序只能用平展(flat)模型 option casemap:none ;指明标识符大小写敏感 include kernel32.inc ;要引用的头文件 includelib kernel32.lib ;要引用的库文件 includelib msvcrt.lib ;引用C库文件 scanf PROTO C:DWORD,:vararg ;C语言scanf函数原型声明 printf PROTO C:DWORD,:vararg ;C语言printf函数原型声明 .data ;⑤数据段 fmt BYTE '%d',0 ;定义变量 fmt2 BYTE '%s',0 ;定义变量 n DWORD 0 s1 BYTE '是素数',0 s2 BYTE '不是素数',0 .code ;⑥代码段 ;**/ fun proc x:dword .if x==2||x==1 invoke printf,addr fmt2,addr s1 .else mov esi,1 mov edi,2 .while edi<x mov eax,x cdq idiv edi .if edx==0 mov esi,0 .endif inc edi .endw .if esi==0 invoke printf,addr fmt2,addr s2 .else invoke printf,addr fmt2,addr s1 .endif .endif ret fun endp ;**/ start: ;定义标号start invoke scanf,ADDR fmt,ADDR n ;输入n的值 invoke fun,n invoke ExitProcess,0 ;退出进程,返回值为0 end start ;指明程序入口点start
最新回复(0)