Как добавить число к беззнаковому мечу с 31 бит, установленным на 1 в сборке, чтобы оно не воспринималось как отрицательное? - PullRequest
2 голосов
/ 17 января 2011

Я пытаюсь добавить 5 к 3234567890 в MASM32.Вот полный пример кода:

;--------------------------------------------------------------------------
include \masm32\include\masm32rt.inc
.data
;--------------------------------------------------------------------------
.code

start: 
call main                   ; branch to the "main" procedure
exit
main proc
local pbuf: DWORD
local buffer[32]: BYTE

mov pbuf, ptr$(buffer)

mov ecx, uval("5") ; converting string to unsigned dword and storing in ecx
mov ebx, uval("3234567890") ;  converting string to unsigned dword and storing in ebx

invoke udw2str, ebx, pbuf ; converting unsigned value to string and storing results in pbuf
print pbuf, 13,10 ; everything is fine so far - 3234567890

add ecx, ebx

invoke udw2str, ebx, pbuf ; once again coverting 
print pbuf, 13,10 ; negative number

ret

main endp    
end start                       ; Tell MASM where the program ends

Как правильно добавить что-то к беззнаковому мечу?Прямо сейчас я получаю отрицательное число и ожидаемый результат - 3234567895.

Обновление: Проблема действительно была где-то в MACRO.Я отредактировал образец до минимума, и он работал правильно.Никаких загадок здесь.:)

;--------------------------------------------------------------------------
include \masm32\include\masm32rt.inc
.data
;--------------------------------------------------------------------------
.code

start: 
call main                   ; branch to the "main" procedure
exit
main proc
local pbuf: DWORD
local buffer[40]: BYTE
local nNumber: DWORD

mov pbuf, ptr$(buffer)

mov ecx, 5 ; no need to convert anything at this point
mov ebx, 3234567890 ;  no need to convert anything at this point

add ebx, ecx

invoke udw2str, ebx, pbuf ; now converting result in ebx to the string (pointed by pbuf)
print pbuf, 13, 10 ; printing pbuf, success

ret

main endp    
end start                       ; Tell MASM where the program ends

Спасибо всем!

1 Ответ

1 голос
/ 17 января 2011

На этом уровне подпись и беззнак - это одно и то же, за исключением команд умножения и деления, поэтому здесь сложение не является ошибкой.

Возможные проблемы, о которых я могу думать:

  1. действительно ли результат сложения в ebx? Существует значительная путаница в отношении того, какой операнд является регистром назначения, так как широко используются два различных соглашения? (даже если это является частью проблемы, на самом деле это не объясняет результат, поскольку это даст 5, не отрицательное число, но все же ...)

  2. в этом сообщении на форуме говорится о проблеме реализации в udw2str.

  3. вы используете pbuf в качестве выходного буфера, но этого недостаточно. Вы полагаетесь на то, что ассемблер поместит его в память непосредственно перед buffer.

  4. неужели print возможно, клопберский отлив?

В этот момент я бы вытащил свой верный отладчик и пошагово прошёл код.

...