MASM - 非常初学者

时间:2011-11-26 14:59:39

标签: assembly overflow cycle

我正在学习集会只需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

1 个答案:

答案 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,因为你会得到一个整数溢出并且它会换行。)