Size: a a a

Ассемблер

2020 September 05

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮... in Ассемблер
так у тя data пустая была?
источник

ST

Saenro T in Ассемблер
Ага)
источник

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮... in Ассемблер
сталкивался с таким, пустую data надо убирать
источник

V

Vlad in Ассемблер
Saenro T
Если в 64bit написать код:
mov al, [rip]
nop
То в al запишется 90h — следующий байт за командой, т.к. rip в то время будет указывать на nop.
При этом, как таковой команды mov al, [rip] не будет, но произойдёт подмена "rip" адресом в памяти следующим за этой командой, т.е. получится mov al, [n], где n — следующий адрес.
В 16/32 это не работает (mov al, [rip]).
А зачем это в 64 — без понятия. (Хотя, это будет короче чем call n в котором pop r, к примеру.)
На счёт pop rip — это скорее чья-то шутка.
Спасибо за ответ
источник

TT

TONYMIN TGD in Ассемблер
楽園松本
Это вопрос очень сложный. Простой ответ на него такой: при  таком представлении отрицательных чисел они ведут себя "правильно" при любых арифметических операциях -- независимо, представляешь ты их как отрицательные или как положительные без знака; они позволяют заменить операции вычитания операцией сложения тд и тп. Короче говоря, происходит чёрная магия двоичной арифметики. Гениальное решение.
То есть, при прибавлении к отрицательному числу, прибавится, как к положительному, но знак будет отрицательным?
источник

TT

TONYMIN TGD in Ассемблер
Зачем полную инверсию выполнять? Почему просто нельзя переключить MSB?
источник

ST

Saenro T in Ассемблер
Допустим у тебя знаковое однобайтовое число (0111 1111) что соответствует +127
Если ты просто включишь старший бит, то получится число -1 (1111 1111)
Теперь, если инвертировать младшие 7 бит, то получится -128 (1000 0000)
источник

H

H̲i̲L̲e̲v̲e̲l̲... in Ассемблер
Saenro T
Допустим у тебя знаковое однобайтовое число (0111 1111) что соответствует +127
Если ты просто включишь старший бит, то получится число -1 (1111 1111)
Теперь, если инвертировать младшие 7 бит, то получится -128 (1000 0000)
Штааа как это работает. Я думал что старший бит всегда показывает знак, а младшие - число
источник

TT

TONYMIN TGD in Ассемблер
H̲i̲L̲e̲v̲e̲l̲
Штааа как это работает. Я думал что старший бит всегда показывает знак, а младшие - число
+
источник

H

H̲i̲L̲e̲v̲e̲l̲... in Ассемблер
Но как число может быть 1, когда все младшие - 111 1111
источник

TT

TONYMIN TGD in Ассемблер
Я тоже не понимаю, почему так
источник

ST

Saenro T in Ассемблер
На самом деле это условно.
Числа в байте от 0 до 255 (0000 0000 до 1111 1111)
Если мы хотим интерпретировать какое-то число как отрицательное, то очевидно, что в байте поместится 127 положительных, 0 и 128 отрицательных.
источник

ST

Saenro T in Ассемблер
В зависимости от того, какой старший бит, такой и будет знак числа. Т.е. число становится уже 7-ми битным + 1 бит тратится на знак.
источник

ST

Saenro T in Ассемблер
Поэтому за нулём или до нуля, int всегда в два раза меньше unsigned int (если кто знает из языков высокого уровня)
источник

H

H̲i̲L̲e̲v̲e̲l̲... in Ассемблер
Saenro T
Допустим у тебя знаковое однобайтовое число (0111 1111) что соответствует +127
Если ты просто включишь старший бит, то получится число -1 (1111 1111)
Теперь, если инвертировать младшие 7 бит, то получится -128 (1000 0000)
Это мы поняли, мы не поняли вот чего:
Ты написал что 1111 1111 в двоичной равно -1 в десятичной
источник

H

H̲i̲L̲e̲v̲e̲l̲... in Ассемблер
А если инвертировать все кроме старшего бита, получится вообще -128
источник

H

H̲i̲L̲e̲v̲e̲l̲... in Ассемблер
Твои слова. Вроде же не так все?
источник

ST

Saenro T in Ассемблер
Может так нагляднее будет)
источник

ST

Saenro T in Ассемблер
Всё идёт задом наперед, не так как вы ожидали?)
источник

ST

Saenro T in Ассемблер
Если от нуля, (байта 0000 0000), отнять единицу (байт 0000 0001), получается же -1 (байт 1111 1111)
источник