NASM - The Netwide Assembler
NASM Forum => Using NASM => Topic started by: flyhigh427 on July 30, 2011, 11:50:28 AM
-
what kind of file do you save mbr to?
i know hard disks and floppy use different metheds..
can both be done with nasm?
thanks
-
You pretty much did it. Read the MBR into a 512 byte buffer, write the buffer to "mbr.bin". We got distracted by "hex" and reading the MBR using IDE controller ports instead of int 13h, but you've got the fundamentals there. To "use" it, read "mbr.bin" into a 512 byte buffer and write it to a hard drive using int 13h (or another method). Since you seem to be having a lot of trouble with it, I'd be pretty cautious with that part, if I were you!
Best,
Frank
-
im scared
im still testing on floppy then usb hd.
i still have alot to do ,it gives me something to do.
p.s. i have to put it in a bin filenot a txt file you say?
-
now that ive backed up everthing on my c: drive and my usb drive ..
are ntfs drives going to be way different then floppys?
thanks
-
now that ive backed up everthing on my c: drive and my usb drive ..
are ntfs drives going to be way different then floppys?
thanks
Yes, but not way different, since a floppy has only 1.5 MB of space, and are slower than drives, also they have their own drive to be put in. That is what I know, but for your chemical test it might work.
Best,
Mahmoud
-
hey yall im getting access denied is that cause im running from windows xp?
;read mbr
mov dx,81h ;DX Data register ; read MBR of target drive
;drive a=ooh,b=01h,80h=first hard drive.81h=second
mov cx,1h ;CX count register for string operations ; it's always the first sector
mov bx, textbuf ;BX index register for MOVE ; point to our buffer
mov ax, 0201h ;AX Accumulator/multiply/divide ; read one sector
int 13h ;13h is Drive Table
jc ReadError
-
Windows XP runs in protected mode and will not allow you to have direct access to hardware. Try using an emulator or simply boot with DOS if that is your goal...
-
can i run nasm code in protected mode too?
thanks
-
can i run nasm code in protected mode too?
thanks
RTFM (http://www.nasm.us/doc/) :)
-
can i run nasm code in protected mode too?
NASM knows nothing about environment where you plan to run your code, – real or protected mode, 16/32 or 64 bit code. It is up to you – write the correct code for proper environment. It's just an assembler – translates mnemonics to opcodes. But as an assembler NASM really can do everything.
-
hey yall i tested in vmware and i get nothing.
but i rebooted and tested it and got the first sector
even though i couldnt see the drive. do u think its a good copy of c: drive ?
if im saving it to bin with this code do you think i could write it back to hd to see?
thanks
org 100h
section .text
start:
;read mbr
mov dx,80h ;DX Data register ; read MBR of target drive
;drive a=ooh,b=01h,80h=first hard drive.81h=second
mov cx,1h ;CX count register for string operations ; it's always the first sector
mov bx, textbuf ;BX index register for MOVE ; point to our buffer
mov ax, 0201h ;AX Accumulator/multiply/divide ; read one sector
int 13h ;13h is Drive Table
jc ReadError
;create test2.bin
mov ah,3Ch ; the open/create-a-file function
mov cx,2 ; file attribute - normal file
mov dx,filename2 ; address of a ZERO TERMINATED! filename string
int 021h ; call on Good Old Dos
jc BadOpen
mov [filehnd2],ax ; returns a file handle (probably 5)
;write to test2.txt
mov ah,040h ; write-to-a-file
mov bx,[filehnd2] ; file handle for standard output
mov cx,512 ; bytes to write - same number we read :)
mov dx,textbuf ; buffer to write from
int 021h ; call on Good Old Dos
;close test2.txt
mov ah,03Eh ; close the file
mov bx,[filehnd2] ; yeah, file handle in bx
int 021h ; call on Good Old Dos
jc CloseError
jmp exit
CloseError:
mov dx,msgclose
mov ah,09
int 21h
xor ax,ax
int 016h
jmp exit
ReadError:
mov dx,msgread
mov ah,09
int 21h
xor ax,ax
int 016h
jmp exit
BadOpen:
mov dx,msgopen
mov ah,09
int 21h
xor ax,ax
int 016h
jmp exit
exit:
mov ah,04Ch ; terminate-program function
int 021h ; you guessed it!
;--------------------------------------------------
section .data
msgclose db "unable to close file...", 0x0d, 0x0a, '$'
msgread db "read error...", 0x0d, 0x0a, '$'
msgopen db "open error...", 0x0d, 0x0a, '$'
filename2 db 'test2.bin',0
;filename1 db 'test1.txt',0
;--------------------------------------------------
textbuf times 512 db 0
filehnd1 dw 0 ;file handles need dw for word
filehnd2 dw 0 ;file handles need dw for word
read_len dw 0
-
hey
on the write to file comment
if i change dl to 80h in both places ,,thats the right place to put for c: drive right?
thanks
;rfloppy opens a bin file test2.bin witch you have to have allready made
;with test2.asm witch makes a backup of a: drive floppy and saves it
;as test2.bin
[BITS 16]
[ORG 0x100]
;open file
mov ax,3D00h ;Open the file
mov al, 0 ;Open for reading
mov dx,filename ;Presume DS points at filename
int 21h ;call dos
jc justError ; check for errors here!
mov [filehnd1], ax ;Save file handle
;read from file
mov bx,[filehnd1] ;Get file handle value
mov ah,3Fh ;Read data from the file
mov dx,buffer ;Address of data buffer
mov cx,512
int 21h
jc justError ; check for errors here!
;close the file
mov bx, [filehnd1]
mov ah,3Eh
int 21h
jc justError ; check for errors here!
;write to floppy
xor ax,ax
mov dl,0 ;is this the place to put 80h
int 0x13
jc justError
mov ah,0x09
mov dx,InitSuccess
int 0x21
loop1:
mov ah,0
mov dl,0 ;is this the place to put 80h
int 0x13
mov al,1
mov ah,3
mov cx,1
mov dx,0
mov bx,buffer
int 0x13
jnc WriteOK
dec byte [Counter]
jz justError
jmp loop1
WriteOK:
mov ah,0x09
mov dx,WriteSuccess
int 0x21
xor ax,ax
int 016h
jmp exit
exit:
mov ax, 4C00h
int 21h
justError:
mov dx,msgclose
mov ah,09
int 21h
xor ax,ax
int 016h
jmp exit
;--------------------------------------------------
section .data
msgclose db "error...", 0x0d, 0x0a, '$'
InitSuccess: db "Floppy initialised successfully.",0x0d, 0x0a, '$'
WriteSuccess: db "Bootsector written successfully.",0x0d, 0x0a, '$'
Counter: db 3
filename db 'test2.bin',0
filehnd1 dw 0 ;file handles need dw for word
buffer times 512 db 0
;---------------------------
-
Three places...
; write to floppy
xor ax,ax
mov dl,0 ;is this the place to put 80h
int 0x13
jc justError
mov ah,0x09
mov dx,InitSuccess
int 0x21
loop1:
mov ah,0
mov dl,0 ;is this the place to put 80h
int 0x13
mov al,1
mov ah,3
mov cx,1
mov dx,0 ; also here!
mov bx,buffer
int 0x13
...
The drive number goes in dl, for the "reset" function (ah=0), the "read" function (ah=2), and the "write" function (ah=3) of int 13h. As I recall, bios assigns "80h" to whichever (physical) drive is booted from (as selected in "setup"). Then, the "code part" of the MBR reads the partition table and loads the "real bootsector" from the partition marked "active". This is what dos will call "drive C:". Dos assigns other drive letters to... physical drives first, then logical partitions (or is it the other way around?). In any case, if you've got multiple drives with multiple partitions, it is quite possible to become confused as to the relationship between "80h", "81h", etc. and "C:", "D:", etc. (ask me how i know!). Be careful!
Your code looks correct to me - you're making good progress... If you're working with a "test machine" that it wouldn't kill ya to lose, "go for it". If you feel the need to "be more careful", you could read the proposed .bin file into a buffer, display the partition table (at least), confirm with the user, read the drive/head/cylinder/sector that you propose to replace into a (different!) buffer, display the partition table (at least), confirm, and write the buffer to the drive... making sure that it's the same as what you displayed - maybe use a common subroutine to set up cx and dx, even? At this point, you're writing an "fdisk" clone, more or less...
Just to make sure you know, a floppy drive doesn't have an MBR. I don't know about a USB device... I would guess "no" if it's emulating a floppy, "yes" otherwise? No idea what an emulator does - whatever you tell it to, I suppose...
I don't remember, for sure, just what the attached file does... I think it just writes to a .dat file and doesn't try to write anything with int 13h, so it should be "safe" to try(?). It'll generate a number of warnings with "modern" Nasm, due to labels with no ':'. Should be okay to ignore 'em... or fix 'em. There may be something in there you can use...
Best,
Frank
-
thanks frank i thought maybe 3 places wasnt sure ,i lkie to comment these ,im doing it now.
again thanks to all .
hey i found one way in vb6 but it was way to complacated for me right now ,it deals with locking the drive and unlocking it afterwords ,,anyways thanks again
-
hey just tested it on my c hard drive it was scary but worked.