MASM - очень новичок - PullRequest
       23

MASM - очень новичок

2 голосов
/ 26 ноября 2011

Я учу ассемблер всего за 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 Ответ

2 голосов
/ 27 ноября 2011

У вас есть несколько проблем здесь.В основном это то, что вы не вызываете ОС для выхода из процесса.Решение состоит в том, чтобы вызвать 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, который содержит прототип функции и файл .lib для ExitProcess.Кроме того, сравнение для bl должно быть 8, чтобы убедиться, что вы сместились 8 раз, а не 7.

Причина, по которой ваша программа раньше выглядела аварийно, была в том, что она не выполнялась должным образом, а не из-залюбая проблема переполнения.Если вы удалите inc bl, оно никогда не прекратится, скрывая исходную проблему.(На самом деле это не совсем так, в конечном итоге он должен переполниться до 7, потому что вы получите целочисленное переполнение, и оно будет перенесено).

...