首页 > 编程语言 >汇编小程序

汇编小程序

时间:2023-04-03 17:41:57浏览次数:29  
标签:汇编 endp 程序 mov call offset main proc

;***********************************************************

 ;*性能度量

 ;***********************************************************


 ;***********************************************************

 ;*程序运行平台

 .386

 .MODEL FLAT,STDCALL

 OPTION CASEMAP:NONE

 ;***********************************************************



 ;***********************************************************

 ;*文件包含

 INCLUDE Irvine32.inc

 ;***********************************************************


 ;***********************************************************

 ;*数据段定义

 .data

 OUTER_LOOP_COUNT=3

 startTime DWORD ?

 msg1 BYTE "Please wait...",0dh,0ah,0

 msg2 BYTE "Elapsed milliseconds:",0

 ;***********************************************************


 ;***********************************************************

 ;代码段定义


 .code

 main proc

   mov edx,offset msg1;

   call WriteString;

   mov startTime,eax;

   mov ecx,OUTER_LOOP_COUNT

   ;执行循环

   L1:

      call innerLoop;

   loopd L1;

   ;显示用去的时间

   call GetMseconds;

   sub eax,startTime;

   mov edx,offset msg2;

   call WriteString;

   call WriteDec;

   call Crlf;

   exit

 main endp


 innerLoop proc

    push ecx;

    mov ecx,0ffffffffh

    L1:

       mov eax,ecx;

    loopd L1;

    pop ecx;

    ret;  

 innerLoop endp;

 end main
;***********************************************************


;**************************************************************
 ;*整数I/O
 ;**************************************************************

 ;**************************************************************
 ;*程序运行平台
 .386
 .model flat,stdcall
 option casemap:none
 ;**************************************************************


 ;**************************************************************
 ;文件包含
 INCLUDE Irvine32.inc
 ;**************************************************************

 ;**************************************************************
 ;*数据段定义
 .data
 arrayD DWORD 100h,2000h,3000h
 prompt1 BYTE "Enter a 32-bit signed integer:",0
 dwordval dword ?
 ;**************************************************************

 ;**************************************************************
 ;*代码段定义
 .code
 main proc 
   mov eax,yellow+(blue*16)
    call SetTextColor;
    call Clrscr
    ;设置文本时蓝底黄字
    mov esi,offset arrayD;
    mov ecx,LENGTHOF arrayD;
    mov ebx,TYPE arrayD
    call DumpMem;
    call Crlf;
    ;提示用户输入一个十进制整数
    mov edx,offset prompt1;
    call WriteString;
    call ReadInt;
    mov dwordval,eax;
    ;以十进制和十六进制和二进制数显示整数
    call Crlf;;换行
    call WriteInt;有符号数十进制格式显示
    call Crlf
    call WriteBin;以二进制显示
    call Crlf
    call WriteHex;以十六进制显示
    call Crlf
    call WaitMsg;
    ;将控制台设置为默认颜色
    mov eax,lightGray+(black*16)
    call SetTextColor;
    call Clrscr
    exit
 main endp 
 end main
 ;**************************************************************

;********************************************************************
 TITLE 随机整数
 ;********************************************************************

 ;********************************************************************
 ;*程序运行平台定义
 .386
 .MODEL FLAT,STDCALL
 OPTION CASEMAP:NONE
 ;********************************************************************

 ;********************************************************************
 ;*文件包含
 INCLUDE Irvine32.inc
 ;********************************************************************

 ;********************************************************************
 ;数据段定义
 .data
 TAB=9
 ;********************************************************************

 ;********************************************************************
 ;*代码段定义
 .code
 main proc
   ;初始化随机数发生器
   call Randomize;
   call Rand1;
   call Rand2;
   exit
 main endp


 Rand1 proc

 mov ecx,10;
 L1:
     CALL Random32
     CALL WriteInt
     MOV  al,TAB;
     CALL WriteChar    
     loop L1;
     CALL Crlf;
 ret    ;
 Rand1 endp;


 Rand2 proc
 mov ecx,10;
 L1:
   ;生成随机数
   call RandomRange;
   sub eax,50;
   call WriteInt;
   mov  al,TAB;
   call WriteChar;  
 loop L1;
 call Crlf;
 ret ;
 Rand2 endp;

 end main;
 ;********************************************************************
;*********************************************************
 TITLE 反转字符
 ;*********************************************************

 ;*********************************************************
 ;*程序要求的运行平台
 .386
 .MODEL FLAT,STDCALL
 OPTION CASEMAP:NONE
 ;*********************************************************

 ;*********************************************************
 ;*文件包含
 INCLUDE Irvine32.inc
 ;*********************************************************

 ;*********************************************************
 ;*数据段定义
 .data
 aName BYTE "Abraham Lincoln",0
 nameSize=$-(aName+1);
 ;*********************************************************

 ;*********************************************************
 ;*代码段定义
 .code
 main proc
    mov ecx,nameSize;
    mov esi,0
    ;将字符串压入堆栈
    L1:
       movzx eax,aName[esi];
       push eax;
       inc esi            
    loop L1;
    ;从堆栈中反弹出字符
    mov ecx,nameSize;重新设置循环次数
    mov esi,0
    L2:
      pop eax;
      mov aName[esi],al;
      inc esi;
    loop L2;
    mov edx,offset aName;
    call WriteString
    exit
 main endp
 end main
 ;*********************************************************

;**************************************************************
 TITLE 三个数相加
 ;**************************************************************

 ;**************************************************************
 ;*程序运行平台
 .386
 .MODEL FLAT,STDCALL
 OPTION CASEMAP:NONE
 ;**************************************************************

 ;**************************************************************
 ;*文件包含
 INCLUDE Irvine32.inc
 ;**************************************************************

 ;**************************************************************
 ;*数据段定义
 .DATA
 val1 BYTE 32h
 val2 BYTE 54h
 val3 BYTE 1ah;
 ;**************************************************************

 ;**************************************************************
 ;*数据段定义
 .CODE
 main proc
   ;函数通过寄存器传递
   XOR EAX,EAX
   XOR EBX,EBX
   XOR EDX,EDX
   MOVZX EAX,val1;
   MOVZX EBX,val2;
   MOVZX EDX,val3
   CALL SumProc
   ;结果存放在edx当中  
   CALL DumpRegs
   exit  
 main endp
 ;--------------------------------------------------------------
 ;SumProc PROC
 ;将EAX,EBX,EDX三个数相加,结果存放在EAX当中
 ;Receives:接收参数
 ;Returns:EAX=SUM
 ;--------------------------------------------------------------
 SumProc proc
   ADD EAX,EBX;
   ADD EAX,EDX;
   RET
 SumProc endp
 end main
 ;**************************************************************


;**************************************************
 TITLE 程序函数调用
 ;**************************************************

 ;**************************************************
 ;程序运行平台要求
 .386
 .MODEL FLAT,STDCALL
 OPTION CASEMAP:NONE
 ;**************************************************

 ;**************************************************
 ;文件包含
 INCLUDE Irvine32.inc
 ;**************************************************


 ;**************************************************
 ;*数据段定义
 .DATA
 msg1 BYTE "The First Function",0dh,0ah,0
 msg2 BYTE "The second Function",0dh,0ah,0
 msg3 BYTE "The Third Function",0dh,0ah,0
 ;**************************************************


 ;**************************************************
 ;*代码段的定义
 .CODE
 main proc
    call function1;
    exit;   
 main endp
 function1 proc
    mov edx,offset msg1;
    call WriteString;
    call function2
    ret
 function1 endp
  
 function2 proc
    mov edx,offset msg2;
    call WriteString;
    ret;
 function2 endp

 function3 proc
    mov edx,offset msg3;
    call WriteString;
    ret;
 function3 endp;
 end main
 ;**************************************************

;************************************************************************
 TITLE 数组求和过程函数化
 ;************************************************************************

 ;************************************************************************
 ;*程序运行平台要求
 .386
 .MODEL FLAT,STDCALL
 OPTION CASEMAP:NONE
 ;************************************************************************

 ;************************************************************************
 ;*文件包含
 INCLUDE Irvine32.inc
 ;************************************************************************


 ;************************************************************************
 ;*数据段定义
 .DATA
 bwarn byte "the Result is ",0;
 array1 BYTE 25h,43h,76h,78h,89H
 array2 BYTE 32h,43h,43h,67h
 bEnter byte 0dh,0ah,0;
 ;************************************************************************

 ;************************************************************************
 ;*代码段定义
 .CODE
 main proc
    ;输出提示信息
    mov edx,offset bwarn;  
    call WriteString;
    mov esi,offset array1;
    mov ecx,sizeof array1;
    call SumProc;
    call WriteHex
    ;输出换行
    mov edx,offset bEnter
    call WriteString;
    ;输出提示信息
    mov edx,offset bwarn;  
    call WriteString;   
    mov esi,offset array2;
    mov ecx,SIZEOF array2;
    call SumProc;
    call WriteHex
    ;输出换行
    mov edx,offset bEnter
    call WriteString;
    exit
 main endp

 SumProc proc USES ESI EAX 
    ;eax存放结果,首先清零
    xor eax,eax
    ;数组索引置零
    xor ebx,ebx;
    L1:
       add al,[esi+ebx]
       ;检测是否产生了进位
       JC CF;
       JMP NCF;
       CF:
             inc ah;
       NCF:
             inc ebx
    loop L1;
    ret;
 SumProc endp

 end main
 ;************************************************************************;************************************************************************
 TITLE 数组求和过程函数化
 ;************************************************************************

 ;************************************************************************
 ;*程序运行平台要求
 .386
 .MODEL FLAT,STDCALL
 OPTION CASEMAP:NONE
 ;************************************************************************

 ;************************************************************************
 ;*文件包含
 INCLUDE Irvine32.inc
 ;************************************************************************


 ;************************************************************************
 ;*数据段定义
 .DATA
 bwarn byte "the Result is ",0;
 array1 BYTE 25h,43h,76h,78h,89H
 array2 BYTE 32h,43h,43h,67h
 bEnter byte 0dh,0ah,0;
 ;************************************************************************

 ;************************************************************************
 ;*代码段定义
 .CODE
 main proc
    ;输出提示信息
    mov edx,offset bwarn;  
    call WriteString;
    mov esi,offset array1;
    mov ecx,sizeof array1;
    call SumProc;
    call WriteHex
    ;输出换行
    mov edx,offset bEnter
    call WriteString;
    ;输出提示信息
    mov edx,offset bwarn;  
    call WriteString;   
    mov esi,offset array2;
    mov ecx,SIZEOF array2;
    call SumProc;
    call WriteHex
    ;输出换行
    mov edx,offset bEnter
    call WriteString;
    exit
 main endp

 SumProc proc USES ESI EAX 
    ;eax存放结果,首先清零
    xor eax,eax
    ;数组索引置零
    xor ebx,ebx;
    L1:
       add al,[esi+ebx]
       ;检测是否产生了进位
       JC CF;
       JMP NCF;
       CF:
             inc ah;
       NCF:
             inc ebx
    loop L1;
    ret;
 SumProc endp

 end main
 ;************************************************************************

USES指令一般是和PROC指令一起被使用的,该指令的作用是,我么可以指定某几个寄存器在函数调用过程中,可以被自由使用,在函数结尾,改寄存器的值,被恢复

比如说USES ECX EDX

那么在函数开始会将这几个寄存器的值压入堆栈,然后再函数返回之前,将这几个寄存器恢复到原来的值(也就是说弹出堆栈)

在此记录下一个小常识,就是JMP后面的指令是目的地址距离当前位置的偏移量,向后则是正数,向前则是负数(使用补码表示)

标签:汇编,endp,程序,mov,call,offset,main,proc
From: https://blog.51cto.com/u_15995156/6166880

相关文章

  • 汇编中数组的加法运算-包含进位
    ;***************************************************************TITLE数组求和;***************************************************************;***************************************************************;*程序的运行环境,最低环境是386,数据段和代......
  • PERL子程序的调用与return操作符
    先不说别的,先上代码usestrict;subwhich_element_is(){my($what,@array)=@_;foreach(0..$#array){if($whateq$array[$_]){return$_;}}-1;}my@names=qw(fredbettydinowilmapebbles);my$results=&which_element_is("dino",@name......
  • PERL语言的子程序
    子程序的定义可以使用关键字sub子程序名(不包含&),以及经过缩进的花括号$n=1;&marine;&marine;&marine;submarine{print"Hello$n\n";$n+=1;}子程序可以在程序的任意位置,如果提前使用在后定义的话,也不用事先声明,只是子函数只能是定义,经过调......
  • 我的第一个win32汇编程序
    .386.ModelFlat,stdcalloptioncasemap:none;头文件包含includewindows.incincludekernel32.incincludelibkernel32.libincludeuser32.incincludelibuser32.libincludegdi32.incincludelibgdi32.lib;数据段定义.datahInstancedd......
  • 汇编延时输出随机数
    ;***********************************************************************;TITLE生成20个随机数;***********************************************************************;***********************************************************************;程序运行......
  • win32汇编语言学习之二
        对于汇编语言来说win32环境中只有一种类型,那就是32位整数,例如MessageBoxA的四个参数HWND,LPCTSTR,LPCTSTR,UINT之所以定义成不同的摸样主要是为了说明其用途,我们在汇编环境下调用MessageBoxA时,DOS状态下会是这样的:  pushuType  pushlpCaption  pushlpText ......
  • 智能且集成的端到端移动应用程序安全解决方案——Quixxi简介
    移动应用程序安全变得简单快捷Quixxi是一种智能且集成的端到端移动应用程序安全解决方案。这个强大的工具可供开发人员在几分钟内保护和监控任何移动应用程序。 QuixxiSecurity评估应用程序,以便您了解它们有哪些漏洞。它允许您对应用程序进行渗透测试,并在应用程序周围放置......
  • 硅谷程序员高薪还能维持多久
    上周Glassdoor公布了最近的软件工程师薪资报告。它反映了公司为写代码付出的成本。Google与Facebook的员工不包括福利的基本工资为12.5万,雅虎的员工薪酬也超过10万美元。大家都知道原因,无论在硅谷还是纽约其他城市,好的程序员十分稀缺,薪酬自然水涨船高。为什么好的工程师这么难找?......
  • C++黑马程序员——P55. 函数的分文件编写
    函数分文件编写一般有4个步骤1.创建后缀名为.h的头文件2.创建后缀名为.cpp的源文件3.在头文件中写函数的声明4.在源文件中写函数的定义 1.创建后缀名为.h的头文件右键项目的“头文件”文件夹->添加->新建项->然后中间选“头文件(.h)”,下面起个名字,添加2.......
  • Python 自动化指南(繁琐工作自动化)第二版:附录 B:运行程序
    原文:https://automateboringuff.com/2e/appendixb/如果您在Mu中打开了一个程序,运行它只需按F5或单击窗口顶部的运行按钮。这是一种在编写程序的同时运行程序的简单方法,但是打开Mu来运行你完成的程序可能是一种负担。根据您使用的操作系统,有更方便的方法来执行Python脚......