2013-09-12 8 views
3

Я пытаюсь записать через ячейки значения адреса переворота 100h to 110h с отрицательными значениями. (Если значение отрицательное - оно остается отрицательным). Не используйте Compare CMP. поэтому я стараюсь, чтобы проверить знак MSB с текстовой команды и он не работает, я написал этуЯ пытаюсь написать в сборке

code segment 
assume ds:code,cs:code 
start: mov ax,code 
mov cx,10 
mov si,100h 
check: 
mov al,[si]  
test al,10000000h//here i have problem! 
je isntnegative 
inc si 
dec cx 
cmp cx,0 
jz finish 
jmp check 
isntnegative: 
neg al 
inc si 
dec cx 
cmp cx,0 
jz finish 
jmp check 
finish: 
int 21h 
nop 
code ends 
end start 

Я знаю, что это долго и эффективно, но это лучшее, что я могу сделать в данный момент.

+3

Непонятно, что вы пытаетесь сделать, на какой платформе вы пишете и какой результат вы ожидаете. Пожалуйста, отредактируйте и укажите некоторый контекст. –

+0

как я говорю, я пытаюсь преобразовать положительное число в отрицательное число –

+0

Почему вы ожидаете найти что-нибудь разумное по адресу 100h? На какой платформе вы нацеливаетесь? В Windows или Linux ваша программа, скорее всего, сбой. В DOS он обработает бессмысленные данные. –

ответ

1

Полагаю, int 21h указывает DOS. Вам нужен номер подфункции в ah, чтобы сделать все возможное. В последний раз, когда вы коснулись ah, это был старший байт code! Директива assume не делает это так. Вы дошли до mov ax, code, вы могли бы также mov ds, ax, так что вы сказали assume на самом деле будет правдой.

Вам нужно, чтобы это было test al, 80h, чтобы узнать, является ли оно отрицательным. (Вы также можете or al, al или and al, al или test al, al установить флаги, и js isnegative ... Я думаю, вы хотели бы jns isntnegative)

Если al не является отрицательным, то отрицать его. Затем вы хотите вернуть отрицательное значение в свой массив? Вы этого не делаете. Если вы это сделаете, тогда это станет важным, когда ваш массив находится в 100h! Если бы вы оставили ds, где DOS оставит его в файле .exe, он будет указывать на PSP (префикс сегмента программы), и смещение 100h, вероятно, будет, где начинается ваш код. Вы, вероятно, не хотите писать на нее! Установив ds на code, смещение 100h, вероятно, пройдет мимо кода для этой простой программы. Хотя это может расти! Возможно, вы захотите сделать свой массив более безопасным. Возможно, вы захотите инициализировать его известными значениями. Возможно, вам захочется отобразить его до и после, чтобы «доказать, что это сработало». Хорошее начало!

3

AL - 8-битный регистр; вы ожидаете, что это будет 32 бита. Если вы работаете с 32-битными данными, вместо этого используйте регистр EAX. Если вы работаете с 16-разрядными данными, используйте AX. И если вы работаете с 64-битными данными, используйте RAX.

И если вы действительно работаете с 8-битными значениями, тогда проверьте 10h, а не 10000000h.

При условии, что вы НЕ работаете с 8-битными значениями, когда вам нужно inc si, вам, вероятно, потребуется увеличить его на 4 (для 32-битных значений) или 2 (для 16-разрядных значений).

Смежные вопросы