您的位置:首页 > 移动开发 > 微信开发

汇编小程序

2013-11-25 11:12 141 查看
;***********************************************************

;*性能度量

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

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

;*程序运行平台

.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后面的指令是目的地址距离当前位置的偏移量,向后则是正数,向前则是负数(使用补码表示)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: