2015-10-02 4 views
2

Я пытаюсь написать программу, которая получает строку, содержащую номер, и поместить в суммированную сумму сумму цифр числа, которое получила функция. это то, что я написал, но он не работает, и я не знаю, почему:Номер печати После использования div и mod-не работает MASM

.386 
.MODEL Flat, STDCALL 
option casemap:none 

SomeFunc proto :DWORD 

include \masm32\include\windows.inc 
include \masm32\include\msvcrt.inc 
includelib \masm32\lib\msvcrt.lib 

.data 

    Sum2 dd ? 
    stop db 0 
    fmt db '%s',0 

.code 

SomeFunc proc Number:DWORD 
    Lop: 
     mov eax,Number 
     mov ebx,'10' 
     xor edx,edx 
     div ebx 
     add Sum2,edx 
     mov Number,eax 
     cmp Number,0 
     jna Lop 
    ret 
SomeFunc endp 

start: 
    invoke SomeFunc,'123' 
    invoke crt_printf,offset Sum2,offset fmt 
end start 

Я действительно не понимаю, почему это не работает, и как я могу заставить его работать. может кто-нибудь объяснить мне? Извините за мой плохой английский. спасибо за помощь.

+0

Определите, что именно _ «Это не работает» означает. – Michael

+0

@Michael - Он не выводит правильный номер, и он падает через секунду. –

ответ

3

Сосредоточение на SomeFunc

  • Вы должны очистить sum2 перед использованием этой функции. Без этого вы можете только надеяться, что повезет 1 раз.
  • Вы хотите разделить на и не строкой «10»
  • Вы должны продолжать цикл, пока EAX не равен нулю.

Применяя все это дает:

SomeFunc proc Number:DWORD 
    mov Sum2, 0 
    mov eax, Number 
    mov ebx, 10 
Lop: 
    xor edx, edx 
    div ebx 
    add Sum2, edx 
    mov Number, eax 
    cmp eax, 0 
    jne Lop 
    ret 
SomeFunc endp 

Обратите внимание, что SomeFunc ожидает число, тогда как invoke SomeFunc,'123' передает указатель на строку в 3 символов.

+0

Пожалуйста, добавьте точку для 'invoke SomeFunc, '123'' ;-) – rkhb

+0

ha спасибо, но я уже исправил это, работая с ollydbg. но в любом случае, я согласен с этим ответом :) –

+0

'invoke SomeFunc, '123'' преобразует' 123 'в целое число: 0x00313233 (decimal: 3224115) и передает это целое число. – rkhb

3

Для устранения аварии:

1) предположительный вы хотите напечатать номер, а не строка. Меняем

fmt db '%s',0 

в

fmt db '%d',0 

2) Измените неправильный порядок и неправильный сдвиг в

invoke crt_printf,offset Sum2,offset fmt ; this would be in C: printf (&Sum2,&fmt); 

в

invoke crt_printf, offset fmt, Sum2 

3) Добавить выход на конец:

invoke crt_exit, 0 

BTW: Я думаю, SomeFunc не будет делать то, что вы хотите. Но для короткого ответа слишком много ошибок. Используйте отладчик, чтобы узнать, что происходит. Я рекомендую OllyDbg.