NASM - The Netwide Assembler
NASM Forum => Programming with NASM => Topic started by: dominick on July 25, 2011, 07:29:13 AM
-
Hi,
I'm creating a compiler and I've successfully gotten it to create a .com file using nasm. I've also gotten it to create an .exe file but the output of the produced executable is gibberish, so I guess it's reading the wrong part of memory? I'm getting no errors from nasm or alink at the moment.
Test.asm:
global main
segment stack stack
st resb 100
[section .text]
main:
mov ax, stack
mov ss, ax
mov sp, 100
mov esi, CD0
call putstr
mov esi, CD1
call putstr
mov ax, 0x4c00
int 0x21
putc:
mov ah, 0x0e
int 0x10
ret
putstr:
lodsb
cmp al, 0x00
je .end
call putc
jmp putstr
.end
ret
CD0 DB "test", 0
CD1 DB 13, 10, 0
and the commands I'm executing for this code are:
nasm -fobj %1 -o test.obj ; %1 being the name of the file.
alink -oEXE -entry main test.obj -o test.exe
If anyone could help me out with this problem, I'd be really grateful,
Dominick
-
When dos loads a .com file, it sets ds and es to your one-and-only segment. When dos loads an .exe, ds and es are pointing to your PSP segment, so you'll need to set 'em to your data segment. In this case, your data's in your code segment, so...
push cs
pop ds
If you'd had a separate data segment:
mov ax, data
mov ds, ax
; maybe es, too...
Dos should have ss and sp all set up, so you don't really need to do that...
Best,
Frank
-
Frank, thank you for your information and the helpful code. I added a data segment to make the code a little bit more organized. The lines for handling the stack seem to satisfy alink's complaints about the stack.
If anyone has a similar problem to this and would like to see the modified code I've posted it below...
global main
segment stack stack
st resb 100
[section .text]
main:
mov ax, data
mov ds, ax
mov ax, stack
mov ss, ax
mov sp, 100
mov esi, CD0
call putstr
mov esi, CD1
call putstr
mov ax, 0x4c00
int 0x21
putc:
mov ah, 0x0e
int 0x10
ret
putstr:
lodsb
cmp al, 0x00
je .end
call putc
jmp putstr
.end
ret
[section .data]
CD0 DB "test", 0
CD1 DB 13, 10, 0