NASM

16-битные ПЦ-совместимые компьютеры с процессорами 8086/8088/80286 работающие под управлением ДОС

Moderator: Shaos

User avatar
Shaos
Admin
Posts: 24011
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

NASM

Post by Shaos »

У нас про NASM (The Netwide Assembler) отдельной темы ещё небыло, хоть и упоминали его неоднократно - короче создаю :roll:

Досовские и виндовые версии качать отсюда:

https://sourceforge.net/projects/nasm/

P.S. Если кому надо наипоследнейшее, то отсюда:

http://www.nasm.us/pub/nasm/releasebuilds/?C=M;O=D
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24011
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: NASM

Post by Shaos »

Создаём COM-файлы (см. http://www.nasm.us/doc/nasmdoc8.html):

Code: Select all

       org 100h

section .text

start:
       ret

section .data

mydata db 0

section .bss

uninit resb 1
Секция .text для кода, секция .data для инициализированных данных, секция .bss для неинициализированных данных (физически не попадает в COM-файл).

Батничек для компиляции:

Code: Select all

nasm test1.asm -fbin -o test1.com
P.S. А вот так предполагается создавать простые EXE-файлы:
8.1.2 Using the bin Format To Generate .EXE Files

The .EXE file format is simple enough that it's possible to build a .EXE file by writing a pure-binary program and sticking a 32-byte header on the front. This header is simple enough that it can be generated using DB and DW commands by NASM itself, so that you can use the bin output format to directly generate .EXE files.

Included in the NASM archives, in the misc subdirectory, is a file exebin.mac of macros. It defines three macros: EXE_begin, EXE_stack and EXE_end.

To produce a .EXE file using this method, you should start by using %include to load the exebin.mac macro package into your source file. You should then issue the EXE_begin macro call (which takes no arguments) to generate the file header data. Then write code as normal for the bin format - you can use all three standard sections .text, .data and .bss. At the end of the file you should call the EXE_end macro (again, no arguments), which defines some symbols to mark section sizes, and these symbols are referred to in the header code generated by EXE_begin.

In this model, the code you end up writing starts at 0x100, just like a .COM file - in fact, if you strip off the 32-byte header from the resulting .EXE file, you will have a valid .COM program. All the segment bases are the same, so you are limited to a 64K program, again just like a .COM file. Note that an ORG directive is issued by the EXE_begin macro, so you should not explicitly issue one of your own.

You can't directly refer to your segment base value, unfortunately, since this would require a relocation in the header, and things would get a lot more complicated. So you should get your segment base by copying it out of CS instead.

On entry to your .EXE file, SS:SP are already set up to point to the top of a 2Kb stack. You can adjust the default stack size of 2Kb by calling the EXE_stack macro. For example, to change the stack size of your program to 64 bytes, you would call EXE_stack 64.

A sample program which generates a .EXE file in this way is given in the test subdirectory of the NASM archive, as binexe.asm.
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
angry_troll
Doomed
Posts: 449
Joined: 08 Apr 2013 04:04
Location: 213.247.249.139

Re: NASM

Post by angry_troll »

Shaos wrote: Досовские и виндовые версии качать отсюда:
https://sourceforge.net/projects/nasm/
[в порядке брюзжания]
"THIS PAGE IS OUT OF DATE; we no longer use any Sourceforge services other than mailing lists."
"We are gradually moving services away from Sourceforge to this page."
http://www.nasm.us же!
привет засранцу лавру :)
User avatar
Shaos
Admin
Posts: 24011
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: NASM

Post by Shaos »

angry_troll wrote:
Shaos wrote: Досовские и виндовые версии качать отсюда:
https://sourceforge.net/projects/nasm/
[в порядке брюзжания]
"THIS PAGE IS OUT OF DATE; we no longer use any Sourceforge services other than mailing lists."
"We are gradually moving services away from Sourceforge to this page."
http://www.nasm.us же!
Intel придумал новые мнемоники для 8086/8088 в последние годы? :o

Я насмом пользовался ещё в 1998 - мне хватало той версии что была на тот момент :)

Там даже MMX-инструкции были, в отличие от TASM, куда надо было их макросами вставлять...
Я тут за главного - если что шлите мыло на me собака shaos точка net
Vic3Dexe
Doomed
Posts: 370
Joined: 16 Dec 2014 11:58
Location: Киев

Re: NASM

Post by Vic3Dexe »

Intel придумал новые мнемоники для 8086/8088 в последние годы?
SSE
AES
AVX/AVX2
FMA
и много чего еще.
О применимости всего это можно спорить, просто для галочки - да, Intel придумал. :)
User avatar
Shaos
Admin
Posts: 24011
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: NASM

Post by Shaos »

Vic3Dexe wrote:
Intel придумал новые мнемоники для 8086/8088 в последние годы?
SSE
AES
AVX/AVX2
FMA
и много чего еще.
О применимости всего это можно спорить, просто для галочки - да, Intel придумал. :)
И все это добро волшебным образом появилось в 8086/8088? :no:
Я тут за главного - если что шлите мыло на me собака shaos точка net
Vic3Dexe
Doomed
Posts: 370
Joined: 16 Dec 2014 11:58
Location: Киев

Re: NASM

Post by Vic3Dexe »

Там даже MMX-инструкции были
Так я думал речь об архитектуре идет :)
User avatar
Shaos
Admin
Posts: 24011
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: NASM

Post by Shaos »

Vic3Dexe wrote:
Там даже MMX-инструкции были
Так я думал речь об архитектуре идет :)
Ну в 1998 я был на гребне волны, а щас так - ретро баловство :)
Я тут за главного - если что шлите мыло на me собака shaos точка net
bigral
Senior
Posts: 152
Joined: 31 Mar 2012 16:50
Location: 93.73.80.128

Re: NASM

Post by bigral »

Shaos wrote:P.S. А вот так предполагается создавать простые EXE-файлы:
8.1.2 Using the bin Format To Generate .EXE Files
По-моему ересь высшей пробы, потому что создаются exe с возможностями хуже чем com. Может если покопать дальше и разобраться то там можно таким способом "руками" создавать "exe" любой сложности, но тут явно нужно быть экспертом в этих DOS loader-ах и memory manager-ах. Может тогда проще накидать свой загружчик в com который обеспечит подгрузку и диспечеризацию любого количества 64кб оверлеев.
User avatar
Shaos
Admin
Posts: 24011
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: NASM

Post by Shaos »

Почему хуже? Код и данные могут в разных сегментах сидеть при такой "ручной" сборке EXE

Кстати я знаком с французом, который эти EXE-макросы для NASM изначально придумал в лихих 90х :)
Я тут за главного - если что шлите мыло на me собака shaos точка net
Vic3Dexe
Doomed
Posts: 370
Joined: 16 Dec 2014 11:58
Location: Киев

Re: NASM

Post by Vic3Dexe »

Что меня всегда вымораживало во всех этих tasm/masm/nasm - на выходе получался obj, а значит обязательно нужен какой-нибудь tlink/ld etc для получения нормального com/exe. Ну и отсутствие IDE в принципе.
Потому давно ушел на fasm и не жалею.
User avatar
Shaos
Admin
Posts: 24011
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: NASM

Post by Shaos »

Ну почему же? Сверху же написано как запускать NASM, чтобы он генерил BIN :)
Я тут за главного - если что шлите мыло на me собака shaos точка net
Vic3Dexe
Doomed
Posts: 370
Joined: 16 Dec 2014 11:58
Location: Киев

Re: NASM

Post by Vic3Dexe »

Да понятно, но это костыль в общем-то, и только под дос. Под винду или линь уже не прокатит такое.
У nasm для меня одно преимущество перед masm/tasm - гораздо более приятный синтаксис. Нет идиотских assume, обращения к переменной var через [var] (как и к любому другому адресу памяти), обращения к адресу переменной через var (без всяких лишних offset).
User avatar
Shaos
Admin
Posts: 24011
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: NASM

Post by Shaos »

Меня там одно смущало всегда - для LEA надо адрес в квадратных скобках указывать и это после MASM выглядело совершенно нелогично...
Я тут за главного - если что шлите мыло на me собака shaos точка net
Vic3Dexe
Doomed
Posts: 370
Joined: 16 Dec 2014 11:58
Location: Киев

Re: NASM

Post by Vic3Dexe »

Именно об этом я и говорю - адрес всегда в квадратных скобках, и это совершенно логично.

В masm - если адрес лежит в регистре, скобки нужны:

Code: Select all

mov ax,[bx]
если нет - не нужны

Code: Select all

mov ax,a

a dw 0
если адрес - константа, приходится городить совсем уже непойми что

Code: Select all

mov ax,ds:[0]
Nasm и fasm предлагают одинаковое поведение во всех случаях:

Code: Select all

mov ax,[bx]
mov ax,[a]
mov ax,[1234h]