fork download
  1. section .data
  2. number dw 5 ; Число для инвертирования бита
  3.  
  4. section .text
  5. global _start
  6.  
  7. _start:
  8. ; Инвертируем 4-й бит
  9.  
  10. mov ax, [number] ; Загружаем число из секции данных в регистр AX
  11. xor ax, 0x0010 ; Инвертируем 4-й бит (0x0010 = 00000000 00010000b)
  12.  
  13. ; Выводим младший байт в шестнадцатеричном виде
  14. movzx eax, al ; Расширяем AL (младший байт AX) до EAX, заполняя нулями
  15. push eax ; Сохраняем значение EAX в стек для передачи в функцию печати
  16. call print_hex ; Вызываем функцию печати в шестнадцатеричном виде
  17. add esp, 4 ; Очищаем стек после вызова функции
  18.  
  19. ; Завершение программы
  20. mov eax, 1 ; Системный вызов exit
  21. xor ebx, ebx ; Код возврата 0
  22. int 0x80 ; Вызов ядра
  23.  
  24. ; Функция для печати числа в шестнадцатеричном виде (младшего байта)
  25. print_hex:
  26. push ebp ; Сохраняем старое значение EBP
  27. mov ebp, esp ; Устанавливаем EBP на вершину стека
  28. push ebx ; Сохраняем регистры, которые будем использовать
  29.  
  30. mov eax, [ebp+8] ; Получаем число из стека
  31.  
  32. ; Вывод старшей цифры (4 бита)
  33. mov bl, al ; Копируем AL в BL
  34. shr bl, 4 ; Сдвигаем вправо на 4 бита, чтобы получить старшую цифру
  35. and bl, 0x0F ; Маскируем, чтобы оставить только 4 младших бита
  36. call print_digit ; Вызываем функцию печати цифры
  37.  
  38. ; Вывод младшей цифры (4 бита)
  39. mov bl, al ; Копируем AL в BL
  40. and bl, 0x0F ; Маскируем, чтобы оставить только 4 младших бита
  41. call print_digit ; Вызываем функцию печати цифры
  42.  
  43. pop ebx ; Восстанавливаем регистры
  44. pop ebp ; Восстанавливаем старое значение EBP
  45. ret ; Возврат
  46.  
  47. ; Функция для печати одной шестнадцатеричной цифры
  48. print_digit:
  49. push ebp
  50. mov ebp, esp
  51.  
  52. cmp bl, 0x0A ; Сравниваем с 10 (A)
  53. jl is_number ; Если меньше 10, это цифра 0-9
  54. add bl, 0x37 ; Если больше или равно 10, это буква A-F (добавляем 'A' - 10 + '0')
  55. jmp print
  56.  
  57. is_number:
  58. add bl, 0x30 ; Преобразуем цифру в ASCII код
  59.  
  60. print:
  61. mov eax, 4 ; Системный вызов write
  62. mov ebx, 1 ; stdout
  63. mov ecx, esp ; Адрес символа для вывода
  64. mov edx, 1 ; Количество байт для вывода
  65. int 0x80 ; Вызов ядра
  66.  
  67. pop ebp
  68. ret
  69.  
Success #stdin #stdout 0s 5280KB
stdin
Standard input is empty
stdout
��