汇编小程序

;***********************************************************
;*性能度量
;***********************************************************

;***********************************************************
;*程序运行平台
.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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

世纪殇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值