.. meta:: :description: reference: http://homepages.ius.edu/jfdoyle/c335/Html/ProcInvoke.htm all: $(PROJECT).exe Lab5 Draft3 =========== .. post:: 23, Jun, 2005 :category: Machine Language :author: me :nocomments: reference: http://homepages.ius.edu/jfdoyle/c335/Html/ProcInvoke.htm | ;===================================================================== | ; lab5.asm - build a program that displays the Fibonacci numbers for a user defined input upper bound | ; Author: Sheng_Jiang | ; Course: COSC 2425 | ; Date: 6/23/05 | ;===================================================================== |    .386 |    option casemap:none |     |    INCLUDE Irvine32.inc |    ; ----------------------------------------------------------------- |    ; include files that have MASM format prototypes for function calls |    ; ----------------------------------------------------------------- |     |    ; ------------------------------------------------ |    ; Library files that have definitions for function |    ; exports and tested reliable prebuilt code. |    ; ------------------------------------------------ |    includelib gdi32.lib |    includelib user32.lib |    includelib kernel32.lib |    includelib Irvine32.lib |     |        ;costants |    CR EQU 0Dh |    LF EQU 0Ah |    TABLEWIDTH EQU  11 |    HBAR        EQU  196 |    VBAR        EQU  179 |    ULCORNER    EQU  218 |    URCORNER    EQU  191 |    MLBORDER EQU  195 |    MRBORDER EQU  180 |    LLCORNER    EQU  192 |    LRCORNER    EQU  217 |    FILLSPACE EQU  32 |    .Data |    menuSelection BYTE 0 |    menustring  BYTE "Menu|I - Display program instructions|N - The user is to enter an integer number from 0 to 20|F - Display the first N Fibonacci numbers on the console|X - Quit the program" |    menustringLen DWORD $-menustring |    menuDelimiter DWORD "\|" |    IsExitSelected BYTE 0 |    number   BYTE 0 |    .CODE |     | ;draw a table line with text and delimiters | DrawTableLine  PROC NEAR C,  |  tableWidth : DWORD, |  beginChar : BYTE, |  textBuffer:NEAR PTR BYTE, |  textLen :DWORD, |  fillChar:BYTE, |  endChar:BYTE |  LOCAL sum : DWORD |  push eax |  push ebx |  push ecx |  ; do nothing if TableWidth<2 |  cmp textLen,2 |  jb DrawTableLineCleanup |  ;beginChar, the left border |  mov   al,byte ptr [ebp+24] |  call  WriteChar | DrawTableLineCleanup: |  pop  ecx |  push ebx |  pop  eax |  ret | DrawTableLine ENDP  |     |     |     |     |    ;the text |     |    ;ebx=min(TableWidth-2,textlen); |    mov   ebx,[ebp+16]    ;ebx=textlen |    mov   eax,ebx |    add   eax,2      ;eax=textlen+2 |    cmp   eax,ecx      ;textlen+2<=TableWidth? |    jbe   DrawTableLinePrintText  ;yes, print it |    mov   ebx,ecx      ;otherwise cut the string to TableWidth-2 characters |    sub   ebx,2      ;ebx=TableWidth-2 | DrawTableLinePrintText: |    ;if no text to print,jump to fill the whole line |    cmp   ebx,0 |    je   DrawTableLineFillLine |    ; print the text part |    push  ebx |    mov   edx, [ebp+20] |    mov   ebx,eax |    call  WriteString |    pop   ebx | DrawTableLineFillLine: |    ;fill the rest of table line |    ;call (fillchar,TableWidth-2-ebx) |    mov   eax, [ebp+28] |    sub   eax, 2 |    sub   eax, ebx |     |    push  ecx |    mov   ecx,eax | DrawTableLineFillLineLoop: |    mov   al, [ebp+12]  |    call  WriteChar   |    loop  DrawTableLineFillLineLoop |    pop   ecx |     |    ;endChar, the right border |    mov   al,[ebp+8] |    call  WriteChar |    ;change line |    mov   al,CR |    call  WriteChar |    mov   al,LF |    call  WriteChar | DrawTableLineCleanup: |    pop  esi |    pop  edx |    pop  ecx  |    pop  ebx  |    pop  eax  |    mov  esp,ebp |    pop  ebp |    ret | DrawTableLine ENDP | ;draw a table top line(using ASCII code) | ;usage:  | ;push TableWidth | ;call DrawTableTop    | ;pop TableWidth | DrawTableTop PROC |    push  ebp |    mov   ebp , esp |    ;call DrawTableLine(TableWidth,ULCORNER,NULL,NULL,HBAR,URCORNER) |    push  [esp+8];TableWidth |    push  ULCORNER |    push  0; |    push  0; |    push  HBAR |    push  URCORNER |    call DrawTableLine |    add  esp,24 |    mov  esp,ebp |    pop  ebp |    ret | DrawTableTop ENDP | ;draw a table buttom line(using ASCII code) | ;usage: | ;push TableWidth | ;call DrawTableButtom    | ;pop TableWidth | DrawTableButtom PROC |    push  ebp |    mov   ebp , esp |    ;call DrawTableLine(TableWidth,LLCORNER,NULL,NULL,HBAR,LRCORNER) |    push  [esp+8];TableWidth |    push  LLCORNER |    push  0; |    push  0; |    push  HBAR |    push  LRCORNER |    call DrawTableLine |    add  esp,24 |    mov  esp,ebp |    pop  ebp |    ret | DrawTableButtom ENDP | ;draw a table middle line(using ASCII code) | ;usage:  | ;push TableWidth | ;call DrawTableMiddleLine    | ;pop TableWidth | DrawTableMiddleLine PROC |    push  ebp |    mov   ebp , esp |    ;call DrawTableLine(TableWidth,MLBORDER,NULL,NULL,FILLSPACE,MRBORDER) |    push  [esp+8];TableWidth |    push  MLBORDER |    push  0; |    push  0; |    push  FILLSPACE |    push  MRBORDER |    call DrawTableLine |    add  esp,24 |    mov  esp,ebp |    pop  ebp |    ret | DrawTableMiddleLine ENDP | ;draw table lines and print text (using ASCII code) | ;wrap to seperate lines if the text is too long, or delimiters were found in the text | ;usage:  | ;push TableWidth | ;push stringbuffer | ;push stringlen | ;push delimiter | ;call DrawTableLineWithWrap | ;pop delimiter | ;pop stringlen   | ;pop stringbuffer  | ;pop TableWidth | DrawTableLineWithWrap PROC |    push  ebp |    mov   ebp , esp |     |    push  eax ;  |    push  ebx ;  |    push  ecx ;  |    push  edx ; |    push  edi ;  |    push  esi ;  |    mov   ebx ,[ebp+8] ;delimiter |    mov   ecx ,[ebp+12] ;stringlen |    mov   edx ,[ebp+20] ;TableWidth |    mov   esi ,[ebp+16] ;stringbuffer |     |    ;DWORD curlinebase=esi; |    ;BOOL bTerminate=FALSE; |    ;BOOL bDelimiter; |    ;edi=esi; |    ; |    ;while(!bTerminate&&edi=esi+ecx) goto DrawTableLineWithWrapCleanup |    mov  eax,esi |    add  eax,ecx |    cmp  edi,eax    |    jae  DrawTableLineWithWrapCleanup |     |    dec  eax |    ;if(edi==esi+ecx-1) goto DrawTableLineWithWrapEndOfBuffer |    cmp  edi,eax    |    je  DrawTableLineWithWrapEndOfBuffer |     |    ;if([edi]==0) goto DrawTableLineWithWrapNullTerminator |    cmp  byte ptr [edi],0 |    je  DrawTableLineWithWrapNullTerminator |     |    ;if([edi]==ebx) goto DrawTableLineWithWrapDelimiter |    cmp  byte ptr [edi],bl |    je  DrawTableLineWithWrapDelimiter |     |    ;if(edi==curlinebase+TableWidth-3) goto DrawTableLineWithWrapLineWrap |    mov  eax,[ebp-36] |    add  eax,edx |    sub  eax,3 |    cmp  edi,eax |    je  DrawTableLineWithWrapLineWrap |    inc  edi |    jmp  DrawTableLineWithWrapLoop | DrawTableLineWithWrapEndOfBuffer: |    ;bTerminate=TRUE,bDelimiter=FALSE; |    mov  dword ptr [ebp-32],1 |    mov  dword ptr [ebp-28],0 |    jmp  DrawTableLineWithWrapDrawLine | DrawTableLineWithWrapNullTerminator: |    ;bTerminate=TRUE,bDelimiter=TRUE; |    mov  dword ptr [ebp-32],1 |    mov  dword ptr [ebp-28],1 |    jmp  DrawTableLineWithWrapDrawLine | DrawTableLineWithWrapDelimiter: |    ; if([edi]==ebx /\*delimiter*/) |    ; { |    ;  if(edi==curlinebase){edi++; continue;}//skip leading delimiters |    ;  else bDelimiter=TRUE; |    ; } |    cmp  edi,[ebp-36] |    je  DrawTableLineWithWrapDelimiter2 |    mov  dword ptr [ebp-28],1 |    jmp  DrawTableLineWithWrapDrawLine | DrawTableLineWithWrapDelimiter2: |    inc  edi |    ; curlinebase=edi; |    mov  [ebp-36],edi |    jmp  DrawTableLineWithWrapLoop    | DrawTableLineWithWrapLineWrap: |    ;bDelimiter=FALSE; |    mov  dword ptr [ebp-28],0 |    ;jmp  DrawTableLineWithWrapDrawLine | DrawTableLineWithWrapDrawLine: |    ; DrawTableLine(TableWidth,MLBORDER,curlinebase,bDelimiter?edi-curlinebase:edi-curlinebase+1,FILLSPACE,MRBORDER); |    push edx    ;TableWidth |    push MLBORDER  ;beginchar |    push [ebp-36]  ;stringbuffer |    ;eax=bDelimiter?edi-curlinebase:edi-curlinebase+1 |    mov  eax,edi |    sub  eax,[ebp-36] |    cmp  dword ptr [ebp-28],0 |    jne  DrawTableLineWithWrapDrawLine2 |    add  eax,1 | DrawTableLineWithWrapDrawLine2:  |    push eax    ;bufferlen |    push FILLSPACE   ;fillchar |    push MRBORDER  ;endchar |    call DrawTableLine |    add  esp,24 |    ; edi++; |    inc  edi |    ; curlinebase=edi; |    mov  [ebp-36],edi |    jmp  DrawTableLineWithWrapLoop | DrawTableLineWithWrapCleanup: |    add   esp ,12 |    pop   esi |    pop   edi |    pop   edx |    pop   ecx |    pop   ebx |    pop   eax |    mov  esp,ebp |    pop  ebp |    ret | DrawTableLineWithWrap ENDP | | ShowMenu Proc |    push  ebp |    mov   ebp , esp |     |    push TABLEWIDTH |    call DrawTableTop |    ;add  esp,4 |     |    ;push TABLEWIDTH |    push OFFSET menustring |    push menustringLen |    push menuDelimiter |    call DrawTableLineWithWrap |    sub  esp,12 |     |    ;push TABLEWIDTH |    call DrawTableButtom |    add  esp,4 |     |    mov  esp,ebp |    pop  ebp |    ret | ShowMenu EndP | ;invoke WriteFile,hOutPut,lpszText,sl,ADDR bWritten,NULL | main  PROC |    int  3 |     |    call ShowMenu | ;text code of OutputChar | ;   push VBAR | ;   call OutputChar | ;   add  esp,4 | ;test code of  DrawTableLineWithWrap   | ;   push TABLEWIDTH | ;   push OFFSET menustring | ;   push menustringLen | ;   push menuDelimiter | ;   call DrawTableLineWithWrap | ;   sub  esp,12 |    |    exit | main  ENDP |    END  main | #===================================================================== | # lab5 - build a program that displays the Fibonacci numbers for a user defined input upper bound | # Author: Sheng_Jiang | # Course: COSC 2425 | # Date: 6/21/05 | #===================================================================== | PROJECT = Lab5 | NAME = Sheng_Jiang | Date = 6/21/05 | ROOTDRIVE       = C | VERSION         = V1 | SRCS   = |     $(PROJECT).asm |     makefile | MASM32          = $(ROOTDRIVE):/masm32 | ML              = $(MASM32)/bin/ml | LINK            = $(MASM32)/bin/link | Zip    = H:/mydoc/Tools/Bin/zip | DEBUG   = c:/masm32/debug/windbg | Irvine32  = H:/mydoc/MyProjct/COSC2425/Lib32 | MLFLAGS         = /I. /I $(MASM32)include /I $(MASM32)macros /I $(Irvine32) /Zi /Zd /Zf /c /Fl /coff /Cp | LINKFLAGS       = /subsystem:console /libpath:$(MASM32)lib /libpath:$(Irvine32) /debug | DEBUGFLAGS  = -QY -g -G -WF $(PROJECT).WEW all: $(PROJECT).exe | $(PROJECT).obj: $(PROJECT).asm |  $(ML) $(MLFLAGS) $(PROJECT).asm | $(PROJECT).exe: $(PROJECT).obj |  $(LINK) $(LINKFLAGS) $(PROJECT).obj | clean: |  del $(PROJECT).exe \*.obj \*.lst \*.map \*.pdb \*.ilk | zip:    clean |   del $(NAME)\_$(PROJECT)\_$(VERSION).zip |         $(Zip) $(NAME)\_$(PROJECT)\_$(VERSION).zip $(SRCS) | debug: $(PROJECT).exe |   $(DEBUG) $(DEBUGFLAGS) $(PROJECT).exe | |