![]() |
#2
zaixuexi2011-05-08 15:51
![]() ;created by zaixuexi 05/06/2011 1:03 a.m 你有时间可以看看这个;SeperateToken .model tiny .code main proc far start: xor ax,ax push ds push ax push cs pop ds push bp mov bp,sp add sp,-6 mov word ptr[bp-2],',' mov [bp-4],offset src mov [bp-6],offset dst call SeperateToken ; SeperateToken(dst, src, ','); mov sp,bp pop bp ret main endp SeperateToken proc near push bp mov bp,sp add sp,-2 xor si,si mov bl,[bp+8] ;---------------; mov si,[bp+6] ; stack layout ; LOW mov di,[bp+4] ;---------------; mov word ptr[bp-2],0 ; ; next: ; ; cmp byte ptr[si],0 ;sp->; local i ; jz exit ;bp->; bp ; +0h mov ax,10 ; ip ; +2h mul word ptr[bp-2] ; dst ; +4h and byte ptr[si],0cfh ; src ; +6h add al,byte ptr[si] ; ',' ; +8h adc ah,0 ; ; mov word ptr[bp-2],ax ;---------------; HIGH inc si cmp bl,[si] jnz short next mov word ptr[bp-2],0 mov [di],ax inc di inc di inc si jmp short next exit: mov sp,bp pop bp ret 6 SeperateToken endp org 0200h src db '1,23,456,7890,',0 dst dw 10 dup(?) end start ;-------------------------------------------------------------------------------- ;DEBUG RESULT: ; ;C:\>debug cc.exe ;-g 62 ; ;AX=1ED2 BX=002C CX=0223 DX=0000 SP=FFF2 BP=FFFA SI=020E DI=0217 ;DS=0C0E ES=0BFE SS=0C0E CS=0C0E IP=0062 NV UP EI PL ZR NA PE NC ;0C0E:0062 C20600 RET 0006 ;-d cs:0200 ;0C0E:0200 01 2C 02 03 2C 04 05 06-2C 07 08 09 00 2C 00 01 .,..,...,....,.. ;0C0E:0210 00 17 00 C8 01 D2 1E 00-00 00 00 00 00 00 00 00 ................ ;--------------------------------------------------------------------------------- ![]() |
这里有关于函数的调用和入栈,我刚学,不太懂,请各位大虾帮忙!!!
; program to input numbers and display running average and sum
; author: R. Detmer
; date: revised 9/97
.386
.MODEL FLAT
INCLUDE io.h
cr EQU 0dh ; carriage return character
Lf EQU 0ah ; linefeed character
.STACK 4096 ; reserve 4096-byte stack
.DATA ; reserve storage for data
num1 DWORD 20 ;第一个数
num2 DWORD 5 ;第二个数
num3 DWORD 64 ;第三个数
labell BYTE cr,Lf,"最大值为:"
max DWORD 20 DUP(?)
BYTE cr,Lf,0
.CODE ; start of main program code
_start:
push num1 ;第一个数入栈
push num2
call max3
dtoa eax,max
output labell
PUBLIC _start ; make entry point public
max3 proc near32
push ebp
mov ebp,esp
pushf
;mov eax,0
mov eax,[ebp+16] ;第一个数放入eax
cmp [ebp+12],eax ;第一个数和第二个数比较
jg cont1 ;大于则转移,把第二个数存到eax里
jmp cont2 ;小于则跳到cont2
cont1:
mov eax,[ebp+12]
cont2:
cmp [ebp+8],eax ;把大的数与第三个数比较
jg cont3 ;大于则转移,把第三个数存到eax里
jmp endcont
cont3:
mov eax,[ebp+8]
jmp encont
endcont:
popf
pop ebp
ret 12
max3 endp
END