;***********************************************************
;*性能度量
;***********************************************************
;***********************************************************
;*程序运行平台
.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