注册 登录
编程论坛 汇编论坛

找出3个数中的最大值

营养书 发布于 2011-05-07 13:28, 1966 次点击

这里有关于函数的调用和入栈,我刚学,不太懂,请各位大虾帮忙!!!
; 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
7 回复
#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   ................
;
---------------------------------------------------------------------------------
你有时间可以看看这个
#3
lz10919149992011-05-09 17:07
很喜欢楼上的代码风格!
#4
zaixuexi2011-05-09 18:27
欢迎高手来交流
#5
营养书2011-05-09 23:10
回复 2楼 zaixuexi
好复杂。。看半天都不明白,惭愧、、、
#6
营养书2011-05-09 23:13
有些小错误,自己又改了一下,可还是不行,各位大虾帮帮忙看一下

.386
.MODEL FLAT
INCLUDE io.h
ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD
cr          EQU    0dh   ; carriage return character
Lf          EQU    0ah   ; linefeed character

.STACK  4096             ; reserve 4096-byte stack

.DATA                    ; reserve storage for data
num1    DWORD    15    ;第一个数
num2    DWORD    5      ;第二个数
num3    DWORD    64     ;第三个数
labell  BYTE     cr,Lf,"最大值为:"
_max    BYTE     20 DUP(?)
        BYTE     cr,Lf,0


.CODE                               ; start of main program code




_start:
      push   num1      ;第一个数入栈
      push   num2
      push   num3
      call   max3
      
      dtoa    _max,eax
      output labell
      
     INVOKE ExitProcess, 0   
PUBLIC _start
max3  PROC   NEAR32
      push  ebp
      mov   ebp,esp
      pushad
      pushf
      mov   eax,0
      mov   eax,[ebp+16]       ;第一个数放入eax
      cmp   [ebp+12],eax       ;第一个数和第二个数比较
      jng    cont1              ;不大于于则转移
      mov   eax,[ebp+12]
      
cont1:      
      cmp   [ebp+8],eax        ;把大的数与第三个数比较
      jng    endcont             ;不大于则转移
      mov   eax,[ebp+8]
     
endcont:
      
      popf
      popad
      mov esp,ebp
      pop ebp
      ret 16
max3 endp
        END
#7
zaixuexi2011-05-09 23:24
回复 5楼 营养书
没关系的,慢慢来
#8
xiaomarn2011-05-10 19:56
.386
.model flat,stdcall
option casemap:none



[ 本帖最后由 xiaomarn 于 2011-5-10 19:58 编辑 ]
1