第一个宏汇编程序,无法计算我们未处理的异常

时间:2013-02-17 05:21:42

标签: windows assembly x86

这是我在masm32中的第一个汇编程序。使用vis studio 2012.这只是程序中的一个过程,用于将输入转换为带有十进制,十六进制和ascii输出的ascii图表。我一直试图弄清楚这8小时,我知道这将是非常简单的事情。 它完成所有计算,但在弹出和返回阶段,它在访问EIP时崩溃成未处理的异常(我认为)。此外,我的所有寄存器都设置为0,除了ebx,我不知道为什么,但它可能与它有关。

这只是将输入字符串转换为十进制值的过程。 *

我的inputStr是:

inputStr   db  16  DUP(0) 

.code
main proc

   xor      eax, eax
   xor      ebx, ebx
   xor      ecx, ecx
   xor      edx, edx

   lea      esi, outputStr1
   call     PrintString
   lea      esi, inputStr
   call     GetString
   call     StrtoNum

   invoke ExitProcess, 0        ;****This is the next line when it crashes***   
main endp

StrtoNum proc  ;going to hex first
    pushad
    pushfd
    mov     bl, 1        ;mov 1 into bl for later multiplying

whilemorechar:
    mov     al,byte ptr [esi]
    cmp     al, 0       ;stuff
    je      ConvertDone      ;if null then we are done here
       ;esi is pointing to the string to be converted
    ;cmp bl,0
    ;jnz decrement
    cmp     al, 0h
    je      ConvertDec
    sub     al, 30h     ;get first string byte to dec number 0-9
    push    ax         ;push last digit to stack
    inc     esi         ;gets to next string byte
    inc     cl          ;make note of decimal position in string
    jmp     whilemorechar      ;jump for next place in string

ConvertDec:             ;reverse is done, now turn into decimal number
    cmp     cl, 0           ;compare counter to 0
    jz      ConvertDone      ;if counter is 0, start comparing numbers
    pop     ax                  ;pop last on stack
    mul     bl                  ;multiply place value by input byte
    add     dx, ax              ;add decimal value into dl
    mov     al, 10d             ;move 10 into al
    mul     bx                  ;multiply 10 and bl value to get next
    mov     bx, ax              ;mov decimal place into bl for next loop 
    dec     cl                  ;decrement counter
    jmp     ConvertDec          ;loop through again for next decimal place

ConvertDone:    
    mov     ebx, 0  
    popfd                   ;pop flags
    popad                   ;pop registers
    ret                     ;return to caller
StrtoNum endp

0 个答案:

没有答案