我正在学习集会只需1-2个小时,请原谅我可能的愚蠢:)
我正在尝试编写一个程序来计算某个字节中“1”位的数量。
问题本身似乎是一个“inc bl”操作码。我猜周期中有错误,所以bl溢出。而且它实际上是循环的问题,因为当我删除“inc bl”程序工作正常(除了事实它没有计算任何东西),但我无法弄清楚什么是错的。
.386
.model flat, stdcall
.data
n BYTE 21
count BYTE 0
.code
start:
mov bl, 0
lp:
cmp bl, 7
jz endl
inc bl
shr n, 1
jc inccount
jmp lp
inccount:
inc count
jmp lp
endl:
end start
答案 0 :(得分:2)
这里有几个问题。主要是你没有调用操作系统退出进程。解决方案是致电ExitProcess:
.386
include \masm32\include\masm32rt.inc
.data
n BYTE 255
count BYTE 0
.code
start:
mov bl, 0
lp:
cmp bl, 8
jz endl
inc bl
shr n, 1
jc inccount
jmp lp
inccount:
inc count
jmp lp
endl:
invoke ExitProcess, 0
end start
您会注意到我包含了masm32rt.inc
,其中包含函数原型和ExitProcess的.lib
文件。除此之外,bl的比较应该是8,以确保你已经移动了8次,而不是7次。
你的程序之前似乎崩溃的原因是因为它没有被正确退出,而不是因为任何溢出问题。如果您删除inc bl
,它将永远不会终止,隐藏原始问题。 (实际上并非严格来说,它应该最终溢出回7,因为你会得到一个整数溢出并且它会换行。)