使用 div 和 mod 后打印编号 - MASM 不工作
Print Number After using div and mod -not working MASM
我正在尝试编写一个程序来获取包含数字的字符串,并将函数获取的数字的数字总和放入 Sum2 变量中。这是我写的,但它不起作用,我不知道为什么:
.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
我真的不明白为什么它不起作用以及如何让它起作用。
有人可以解释我吗?
对不起,我的英语不好。
感谢您的帮助。
消除崩溃:
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
顺便说一句:我猜 SomeFunc
不会做你想做的事。但是错误太多,无法简短回答。使用调试器查看发生了什么。我推荐 OllyDbg.
专注于 SomeFunc
- 在使用此函数之前,您应该清除 Sum2。不这样做只能希望幸运1次
- 您想除以 10 而不是字符串 '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 个字符的字符串的指针。
我正在尝试编写一个程序来获取包含数字的字符串,并将函数获取的数字的数字总和放入 Sum2 变量中。这是我写的,但它不起作用,我不知道为什么:
.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
我真的不明白为什么它不起作用以及如何让它起作用。 有人可以解释我吗? 对不起,我的英语不好。 感谢您的帮助。
消除崩溃:
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
顺便说一句:我猜 SomeFunc
不会做你想做的事。但是错误太多,无法简短回答。使用调试器查看发生了什么。我推荐 OllyDbg.
专注于 SomeFunc
- 在使用此函数之前,您应该清除 Sum2。不这样做只能希望幸运1次
- 您想除以 10 而不是字符串 '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 个字符的字符串的指针。