0

これは、masm32での私の最初のアセンブラプログラムです。vis studio 2012を使用します。これは、入力を10進数、16進数、およびASCII出力のASC​​IIチャートに変換するプログラムの1つの手順にすぎません。私はこれを8時間理解しようとしてきましたが、これは本当に単純なことになると思います。それはすべての計算を通過しますが、ポップとリターンのフェーズ中に、EIPにアクセスするときに未処理の例外にクラッシュします(私は思います)。また、ebxを除いてすべてのレジスタが0に設定されており、理由はわかりませんが、それと関係がある可能性があります。

これは、入力文字列から10進値に変換するための単なる手順です。*

私の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