Мне нужно было написать код для проверки LSB cr0
в nasm. Код выглядит следующим образом:Почему mov rax, cr0 вызывает ошибку сегментации в nasm 64 бит
section .data
temp : db 00h ;Temporary storage
nl : db 10 ;Memory which holds decimal 10 to print a newline
section .text
global _start
_start:
mov rax,cr0 ;Move contents of cr0 into rax
bt rax,0 ;Test LSB of rax
jnc l1 ;If 0, move 30 into temp (ASCII for '0')
mov byte[temp],31h ;Else, move 31 into temp
jmp l2
l1:
mov byte[temp],30h
l2:
print temp,1 ;Print value of temp
print nl,1
mov rax,60 ;Exit syscall
mov rdi,0
syscall
Код при запуске вызывает ошибку сегментации. Это происходит из-за инструкции mov rax,cr0
. Когда эта команда прокомментирована, не возникает ошибка сегментации. Почему это так? Связано ли это с уровнем привилегий пользователя? Заранее спасибо.
Да, точно. 'CR0' - системный регистр, недоступный в пользовательском режиме. Если вы обратитесь к руководству по набору инструкций, вы увидите, что он говорит: Исключения для 64-битного режима #GP (0) Если текущий уровень привилегий не равен 0._ – Jester
Любое обходное решение этой проблемы? Или мое направление мышления неверно? @Jester –
Что вы хотите делать с содержимым 'cr0'? – fuz