0

这是我在 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
4

0 回答 0