fork download
  1. #include <iostream>
  2. #include <cstdint>
  3.  
  4. int main() {
  5. uint32_t value = 0x12345678; // Пример 32-битного числа (разделим его на DX:AX)
  6.  
  7. // Разделяем число на старшую (DX) и младшую (AX) части
  8. uint16_t dx = (value >> 16) & 0xFFFF; // Старшие 16 бит (DX)
  9. uint16_t ax = value & 0xFFFF; // Младшие 16 бит (AX)
  10.  
  11. uint32_t result; // Сюда запишем результат
  12.  
  13. // Ассемблерная вставка (переносим DX:AX → ECX)
  14. asm volatile (
  15. "movw %[ax], %%ax\n" // Загружаем AX
  16. "movw %[dx], %%dx\n" // Загружаем DX
  17. "shl $16, %%edx\n" // Сдвигаем DX в старшие 16 бит EDX
  18. "movw %%ax, %%cx\n" // Загружаем AX в CX
  19. "orl %%edx, %%ecx\n" // Объединяем DX и AX в ECX
  20. "movl %%ecx, %[res]\n" // Сохраняем результат
  21. : [res] "=r" (result) // Выходной операнд
  22. : [ax] "r" (ax), // Входные операнды
  23. [dx] "r" (dx)
  24. : "eax", "edx", "ecx" // Список изменяемых регистров
  25. );
  26.  
  27. std::cout << "Исходное число: 0x" << std::hex << value << std::endl;
  28. std::cout << "Результат в ECX: 0x" << std::hex << result << std::endl;
  29.  
  30. return 0;
  31. }
Success #stdin #stdout 0.01s 5332KB
stdin
Standard input is empty
stdout
Исходное число: 0x12345678
Результат в ECX: 0x12345678