0
点赞
收藏
分享

微信扫一扫

汇编小程序

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

 ;*性能度量

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


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

 ;*程序运行平台

 .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后面的指令是目的地址距离当前位置的偏移量,向后则是正数,向前则是负数(使用补码表示)

举报

相关推荐

0 条评论