Я немного протестировал ассемблер на Linux с использованием синтаксиса AT & T. Меня поразило то, что книга, которую я читал, была написана с 32-битной точки зрения. Таким образом, все размеры должны быть изменены на правильные 64-битные версии для меня. Или я мог бы (что я и сделал) собрать код, используя флаг - 32 для как и флаг -melf_i386 для ld при связывании. Я также адаптировал часть кода для работы в Windows под Cygwin.
Но это заставило меня задуматься. Есть ли способ сделать ifdef как проверки в ассемблере, чтобы сделать одну вещь, если я на Windows и другую под Linux , а также обработать 32 против 64 немного таким образом? Например, для .globl _start под Linux и .globl _main под Windows.
Или это выполняется путем проверки перед сборкой и создания различных исходных файлов для сборки на основе результатов проверок?
т.е. foo_linux.s и foo_windows.s
Если так, как вы преодолеете тот факт, что вы не будете знать, какие .s файлы вы будете использовать, и, следовательно, должны включать их при создании программы?
Например, скажем, что у нас есть socket_linux.s и socket_windows.s . Они оба представляют идентичный интерфейс, но выполняют специфическую для ОС работу, связанную с сокетами. Но когда я работаю с сокетами в моей программе, я не буду знать, нужна ли мне версия для Windows или Linux. Так что я бы как бы облажался :) 1043 *
Так как это обрабатывается в Ассемблере? Например, в C ++ я мог бы включить мои socket.h и socket.cpp и обернуть весь специфичный для Linux и Windows код в # ifdef .