0000000000400ee0 <phase_1>:
400ee0: 48 83 ec 08 sub $0x8,%rsp
400ee4: be 00 24 40 00 mov $0x402400,%esi
400ee9: e8 4a 04 00 00 callq 401338 <strings_not_equal>
400eee: 85 c0 test %eax,%eax
400ef0: 74 05 je 400ef7 <phase_1+0x17>
400ef2: e8 43 05 00 00 callq 40143a <explode_bomb>
400ef7: 48 83 c4 08 add $0x8,%rsp
400efb: c3 retq
Выше приведен код сборки функции, которая сравнивает входную строку пользователя и фиксированную строку, заданную программой.
Мой вопрос заключается в том, что в mov $0x402400,%esi
почему инструкция не сохраняет десятичное значение, а именно, 4 * 16 ^ 5 + 2 * 16 ^ 3 + 4 * 16 ^ 1 в %esi
,Вместо этого он фактически сохраняет этот адрес $0x402400
в %esi
.Итак, является ли $0x402400
целочисленным значением, которое не может быть разыменовано или по которому содержимое памяти не может быть проверено) или адресом, по которому мы можем проверить содержимое (разыменование)?
И почему в этоминструкция add $0x8,%rsp
, $0x8
является целочисленным значением 8
для сохранения в регистре?Почему в данном случае это не адрес, который мы можем разыменовать?
PS: Любая ссылка на четкое определение, подобное учебнику, будет очень цениться.