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