* newbie question on gnu 'as'
@ 2002-07-30 11:59 Anticipating a Reply
2002-07-30 17:24 ` Bruno N. F. Pacheco
2002-07-30 21:34 ` Emanuele Altieri
0 siblings, 2 replies; 9+ messages in thread
From: Anticipating a Reply @ 2002-07-30 11:59 UTC (permalink / raw)
To: Assembly Linux
Hi Everybody,
I have got a small piece of Assembly code ,
which writes a character "A" on the screen .
The below program is compiled and written
to the boot sector of a floppy. It compiles
using the command :
as86 boot.s -o boot.o
ld86 -d boot.o -o boot
I want to rewrite it in AT&T syntax and
want to use GNU "as" assembler to compile it .
I tried doing it ,but with no success .
Can anybody please help me rewite the
below code in AT&T syntax and tell me how
to compile & link it ?
Thanks in Advance .
With Best Regards
THE CODE :
------------
entry start
start:
mov ax,#0xb800 ; Video Memory address is 0xb800
mov es,ax ; Video Memory is made as Extra
Segment
seg es ; Makes next instruction execute
wrt Extra Segment
mov [0],#0x41 ; ASCII value of the Character
to be displayed
; in 1-row & 1-column
seg es ; Makes next instruction execute
wrt Extra Segment
mov [1],#0x1f ; Attribute of the Character to
be displayed
; in 1-row & 1-column
; 0x1f represents White
Character on a Blue Background
loop1:
jmp loop1
________________________________________________________________________
Want to sell your car? advertise on Yahoo Autos Classifieds. It's Free!!
visit http://in.autos.yahoo.com
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: newbie question on gnu 'as' 2002-07-30 11:59 newbie question on gnu 'as' Anticipating a Reply @ 2002-07-30 17:24 ` Bruno N. F. Pacheco 2002-07-30 21:34 ` Emanuele Altieri 1 sibling, 0 replies; 9+ messages in thread From: Bruno N. F. Pacheco @ 2002-07-30 17:24 UTC (permalink / raw) To: linux-assembly Just read the comments.. /* * letter.S * * % as letter.S -o letter.o * % ld -s letter.o * % a.out * * by live <brunonfp@fastmail.fm> */ .data buffer: .byte 65 .text .globl _start .align 4 _start: movl $4, %eax # write() syscall movl $1, %ebx # stdout leal buffer, %ecx # buff pointer movl $1, %edx # number of characters to write int $0x80 # call kernel /* Ignoring erros */ .loop: jmp .loop -- Bruno N. F. Pacheco On Tue, 30 Jul 2002, [iso-8859-1] Anticipating a Reply wrote: > Hi Everybody, > > I have got a small piece of Assembly code , > which writes a character "A" on the screen . > > The below program is compiled and written > to the boot sector of a floppy. It compiles > using the command : > > as86 boot.s -o boot.o > ld86 -d boot.o -o boot > > I want to rewrite it in AT&T syntax and > want to use GNU "as" assembler to compile it . > I tried doing it ,but with no success . > > Can anybody please help me rewite the > below code in AT&T syntax and tell me how > to compile & link it ? > > Thanks in Advance . > > With Best Regards > > > THE CODE : > ------------ > > > entry start > > start: > mov ax,#0xb800 ; Video Memory address is 0xb800 > > mov es,ax ; Video Memory is made as Extra > Segment > seg es ; Makes next instruction execute > wrt Extra Segment > mov [0],#0x41 ; ASCII value of the Character > to be displayed > ; in 1-row & 1-column > seg es ; Makes next instruction execute > wrt Extra Segment > mov [1],#0x1f ; Attribute of the Character to > be displayed > ; in 1-row & 1-column > ; 0x1f represents White > Character on a Blue Background > loop1: > jmp loop1 > > > ________________________________________________________________________ > Want to sell your car? advertise on Yahoo Autos Classifieds. It's Free!! > visit http://in.autos.yahoo.com > - > To unsubscribe from this list: send the line "unsubscribe linux-assembly" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > > ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: newbie question on gnu 'as' 2002-07-30 11:59 newbie question on gnu 'as' Anticipating a Reply 2002-07-30 17:24 ` Bruno N. F. Pacheco @ 2002-07-30 21:34 ` Emanuele Altieri 2002-07-31 5:16 ` Anticipating a Reply 1 sibling, 1 reply; 9+ messages in thread From: Emanuele Altieri @ 2002-07-30 21:34 UTC (permalink / raw) To: ruxyz; +Cc: Linux Assembly List [-- Attachment #1: Type: text/plain, Size: 2357 bytes --] I'm assuming that you want to keep your code as a boot program: .code16 # needed for booting .global _start _start: movw $0xB800, %ax movw %ax, %es movb $0x41, %es:0 movb $0x1f, %es:1 loop1: jmp loop1 To assembly and link the program: as -o boot.o boot.s ld -s -oformat binary -Ttext 0x0 -o boot boot.o The last command creates the "boot" file that is ready to be installed in the first sector of the floppy disk: dd seek=0 if=boot of=/dev/fd0 Hope this helps -Emanuele On Tue, 2002-07-30 at 07:59, Anticipating a Reply wrote: > Hi Everybody, > > I have got a small piece of Assembly code , > which writes a character "A" on the screen . > > The below program is compiled and written > to the boot sector of a floppy. It compiles > using the command : > > as86 boot.s -o boot.o > ld86 -d boot.o -o boot > > I want to rewrite it in AT&T syntax and > want to use GNU "as" assembler to compile it . > I tried doing it ,but with no success . > > Can anybody please help me rewite the > below code in AT&T syntax and tell me how > to compile & link it ? > > Thanks in Advance . > > With Best Regards > > > THE CODE : > ------------ > > > entry start > > start: > mov ax,#0xb800 ; Video Memory address is 0xb800 > > mov es,ax ; Video Memory is made as Extra > Segment > seg es ; Makes next instruction execute > wrt Extra Segment > mov [0],#0x41 ; ASCII value of the Character > to be displayed > ; in 1-row & 1-column > seg es ; Makes next instruction execute > wrt Extra Segment > mov [1],#0x1f ; Attribute of the Character to > be displayed > ; in 1-row & 1-column > ; 0x1f represents White > Character on a Blue Background > loop1: > jmp loop1 > > > ________________________________________________________________________ > Want to sell your car? advertise on Yahoo Autos Classifieds. It's Free!! > visit http://in.autos.yahoo.com > - > To unsubscribe from this list: send the line "unsubscribe linux-assembly" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html [-- Attachment #2: boot.s --] [-- Type: text/plain, Size: 416 bytes --] # boot.s # # To assembly and link as a **boot** program: # # as boot.s -o boot.o # ld -s -oformat binary -Ttext 0x0 -o boot boot.o # # To copy it to the boot sector of a floppy disk: # # dd seek=0 if=boot of=/dev/fd0 # # --- # Emanuele (ealtieri@hampshire.edu) .code16 .global _start _start: movw $0xB800, %ax movw %ax, %es movb $0x41, %es:0 movb $0x1f, %es:1 loop1: jmp loop1 ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: newbie question on gnu 'as' 2002-07-30 21:34 ` Emanuele Altieri @ 2002-07-31 5:16 ` Anticipating a Reply 2002-07-31 7:55 ` newbie question on gnu 'as' => explaination about the why (for really newbie ;-)) Frederic Marmond 0 siblings, 1 reply; 9+ messages in thread From: Anticipating a Reply @ 2002-07-31 5:16 UTC (permalink / raw) To: Emanuele Altieri; +Cc: Linux Assembly List Hello Emanuele , Thank you for the below code you sent . It works perfectly and will help me learn more of assembly . Can you please help me figure out where I'am wrong in the code below, which I have witten for the same functionality . .code16 .globl _start _start: movw $0xb800,%bx # Video Memory address movb $0x41,(%bx) # ASCII value to be displayed movw $0xb801,%bx # Video Memory address movb $0x1f,(%bx) # Attribute of the Character loop1: jmp loop1 Thanks once again . With Best Regards --- Emanuele Altieri <ealtieri@hampshire.edu> wrote: > I'm assuming that you want to keep your code as a > boot program: > > .code16 # needed for > booting > .global _start > _start: > movw $0xB800, %ax > movw %ax, %es > movb $0x41, %es:0 > movb $0x1f, %es:1 > loop1: jmp loop1 > > > To assembly and link the program: > > as -o boot.o boot.s > ld -s -oformat binary -Ttext 0x0 -o boot boot.o > > The last command creates the "boot" file that is > ready to be > installed in the first sector of the floppy disk: > > dd seek=0 if=boot of=/dev/fd0 > > > Hope this helps > > -Emanuele > > > On Tue, 2002-07-30 at 07:59, Anticipating a Reply > wrote: > > Hi Everybody, > > > > I have got a small piece of Assembly code > , > > which writes a character "A" on the screen . > > > > The below program is compiled and written > > to the boot sector of a floppy. It compiles > > using the command : > > > > as86 boot.s -o boot.o > > ld86 -d boot.o -o boot > > > > I want to rewrite it in AT&T syntax and > > want to use GNU "as" assembler to compile it . > > I tried doing it ,but with no success . > > > > Can anybody please help me rewite the > > below code in AT&T syntax and tell me how > > to compile & link it ? > > > > Thanks in Advance . > > > > With Best Regards > > > > > > THE CODE : > > ------------ > > > > > > entry start > > > > start: > > mov ax,#0xb800 ; Video Memory address is > 0xb800 > > > > mov es,ax ; Video Memory is made as > Extra > > Segment > > seg es ; Makes next instruction > execute > > wrt Extra Segment > > mov [0],#0x41 ; ASCII value of the > Character > > to be displayed > > ; in 1-row & 1-column > > seg es ; Makes next instruction > execute > > wrt Extra Segment > > mov [1],#0x1f ; Attribute of the Character > to > > be displayed > > ; in 1-row & 1-column > > ; 0x1f represents White > > Character on a Blue Background > > loop1: > > jmp loop1 > > > > > > > ________________________________________________________________________ > > Want to sell your car? advertise on Yahoo Autos > Classifieds. It's Free!! > > visit http://in.autos.yahoo.com > > - > > To unsubscribe from this list: send the line > "unsubscribe linux-assembly" in > > the body of a message to majordomo@vger.kernel.org > > More majordomo info at > http://vger.kernel.org/majordomo-info.html > > > > # boot.s > # > # To assembly and link as a **boot** program: > # > # as boot.s -o boot.o > # ld -s -oformat binary -Ttext 0x0 -o boot boot.o > # > # To copy it to the boot sector of a floppy disk: > # > # dd seek=0 if=boot of=/dev/fd0 > # > # --- > # Emanuele (ealtieri@hampshire.edu) > > .code16 > .global _start > _start: > movw $0xB800, %ax > movw %ax, %es > movb $0x41, %es:0 > movb $0x1f, %es:1 > loop1: jmp loop1 > ________________________________________________________________________ Want to sell your car? advertise on Yahoo Autos Classifieds. It's Free!! visit http://in.autos.yahoo.com ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: newbie question on gnu 'as' => explaination about the why (for really newbie ;-)) 2002-07-31 5:16 ` Anticipating a Reply @ 2002-07-31 7:55 ` Frederic Marmond 2002-07-31 10:09 ` Anticipating a Reply 0 siblings, 1 reply; 9+ messages in thread From: Frederic Marmond @ 2002-07-31 7:55 UTC (permalink / raw) To: ruxyz; +Cc: Emanuele Altieri, Linux Assembly List Hi, Here are some explainations you may want to know. When your PC boots, it is in real mode. This mode (!= protected mode) manage memory in this way: segment+offset The segment is a 64ko range , step by 16 bytes. So, if you want to write to b8000 (video memory start in text mode), you may set your segment at 0xb800 (=> 0xb800 * 16 = 0xb8000) Then, you can adress this segment of 65536 bytes with an offset of 16bits. (that's why in real mode you can only see the first 1Mo of your memory: 0xFFFF*16 = 0xFFFF0 ~= 1024*1024 (in fact, a little bit more than 1Mo, because of the offset of 0xffff max)) For your problem, in pseudo code: mov 0x411f to 0xb800:0 (write 0x411f to the corner high-left) mov 0x411f to 0xb800:(80*2 *10+ 20*2) (write 0x411f to the 10th line (80*2 *10= 80(charPerLine) *2(1char=ascii+attribut) *10(10th line)) and 20th char) in assembly, segments are stored in special registers: ds (Data Segment), CS(Code Segment), Es,Fs,Gs (Extra Segments), SS(Stack Segment) Offset may be any of the followings (Ax,Bx,Cx,Dx,Si,Di,Sp). (and, in 32bits mode: eAx,eBx,eCx....) So, the pseudo code may be write like that ((in intel syntax, which I prefer, and that compile with nasm): mov ax,0xb800 mov es,ax ; we cannot affect directly value to seg register (cannot write mov es,0xb800) mov bx,0x0 ; start of the segment mov [es:bx],0x411f ;the compilator will assume automaticaly movw (mov word => 16 bits) That is what Emanuele wrote you (in At&t syntax): movw $0xB800, %ax movw %ax, %es ; affect the start adress to the segment movb $0x41, %es:0 ; store value in the video memory movb $0x1f, %es:1 ; these 2 lines may be = to movw $0x411f,%es:0 hope it helps! Fred Anticipating a Reply wrote: >Hello Emanuele , > > Thank you for the below code >you sent . It works perfectly and >will help me learn more of assembly . > > Can you please help me figure >out where I'am wrong in the code below, >which I have witten for the same >functionality . > >.code16 > >.globl _start > >_start: > movw $0xb800,%bx # Video Memory address > movb $0x41,(%bx) # ASCII value to be displayed > > > movw $0xb801,%bx # Video Memory address > movb $0x1f,(%bx) # Attribute of the Character >loop1: > jmp loop1 > > > Thanks once again . > >With Best Regards > > --- Emanuele Altieri <ealtieri@hampshire.edu> wrote: > > >>I'm assuming that you want to keep your code as a >>boot program: >> >> .code16 # needed for >>booting >> .global _start >> _start: >> movw $0xB800, %ax >> movw %ax, %es >> movb $0x41, %es:0 >> movb $0x1f, %es:1 >> loop1: jmp loop1 >> >> >>To assembly and link the program: >> >> as -o boot.o boot.s >> ld -s -oformat binary -Ttext 0x0 -o boot boot.o >> >>The last command creates the "boot" file that is >>ready to be >>installed in the first sector of the floppy disk: >> >> dd seek=0 if=boot of=/dev/fd0 >> >> >>Hope this helps >> >> -Emanuele >> >> >>On Tue, 2002-07-30 at 07:59, Anticipating a Reply >>wrote: >> >> >>>Hi Everybody, >>> >>> I have got a small piece of Assembly code >>> >>> >>, >> >> >>>which writes a character "A" on the screen . >>> >>> The below program is compiled and written >>>to the boot sector of a floppy. It compiles >>>using the command : >>> >>> as86 boot.s -o boot.o >>> ld86 -d boot.o -o boot >>> >>> I want to rewrite it in AT&T syntax and >>>want to use GNU "as" assembler to compile it . >>>I tried doing it ,but with no success . >>> >>> Can anybody please help me rewite the >>>below code in AT&T syntax and tell me how >>>to compile & link it ? >>> >>> Thanks in Advance . >>> >>>With Best Regards >>> >>> >>>THE CODE : >>>------------ >>> >>> >>>entry start >>> >>>start: >>> mov ax,#0xb800 ; Video Memory address is >>> >>> >>0xb800 >> >> >>> >>> mov es,ax ; Video Memory is made as >>> >>> >>Extra >> >> >>>Segment >>> seg es ; Makes next instruction >>> >>> >>execute >> >> >>>wrt Extra Segment >>> mov [0],#0x41 ; ASCII value of the >>> >>> >>Character >> >> >>>to be displayed >>> ; in 1-row & 1-column >>> seg es ; Makes next instruction >>> >>> >>execute >> >> >>>wrt Extra Segment >>> mov [1],#0x1f ; Attribute of the Character >>> >>> >>to >> >> >>>be displayed >>> ; in 1-row & 1-column >>> ; 0x1f represents White >>>Character on a Blue Background >>>loop1: >>> jmp loop1 >>> >>> >>> >>> >>> >________________________________________________________________________ > > >>>Want to sell your car? advertise on Yahoo Autos >>> >>> >>Classifieds. It's Free!! >> >> >>> visit http://in.autos.yahoo.com >>>- >>>To unsubscribe from this list: send the line >>> >>> >>"unsubscribe linux-assembly" in >> >> >>>the body of a message to majordomo@vger.kernel.org >>>More majordomo info at >>> >>> >>http://vger.kernel.org/majordomo-info.html >> >> >> >> >>># boot.s >>> >>> >># >># To assembly and link as a **boot** program: >># >># as boot.s -o boot.o >># ld -s -oformat binary -Ttext 0x0 -o boot boot.o >># >># To copy it to the boot sector of a floppy disk: >># >># dd seek=0 if=boot of=/dev/fd0 >># >># --- >># Emanuele (ealtieri@hampshire.edu) >> >> .code16 >> .global _start >>_start: >> movw $0xB800, %ax >> movw %ax, %es >> movb $0x41, %es:0 >> movb $0x1f, %es:1 >>loop1: jmp loop1 >> >> >> > >________________________________________________________________________ >Want to sell your car? advertise on Yahoo Autos Classifieds. It's Free!! > visit http://in.autos.yahoo.com >- >To unsubscribe from this list: send the line "unsubscribe linux-assembly" in >the body of a message to majordomo@vger.kernel.org >More majordomo info at http://vger.kernel.org/majordomo-info.html > > > ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: newbie question on gnu 'as' => explaination about the why (for really newbie ;-)) 2002-07-31 7:55 ` newbie question on gnu 'as' => explaination about the why (for really newbie ;-)) Frederic Marmond @ 2002-07-31 10:09 ` Anticipating a Reply 2002-07-31 11:31 ` Frederic Marmond 0 siblings, 1 reply; 9+ messages in thread From: Anticipating a Reply @ 2002-07-31 10:09 UTC (permalink / raw) To: fmarmond; +Cc: Emanuele Altieri, Linux Assembly List Hi Frederic , Thank you very much for all the explanation you have given about the addressing in 16-bit real mode . From this explanation , I think I was wrong in line number 7 , which had 0xb800 acting as an offset to the Data Segment . That is,if I'am not wrong we always need to specify the addresses in the below format - seg_reg:offset ---- OR ---- if given as movb $xxx , ( %seg_reg ) then the contents of "seg_reg" will be considered as an Offset with respect to the Data Segment. 1> .code16 2> 3> .globl _start 4> 5> _start: 6> movw $0xb800,%bx # Video Memory address 7> movb $0x41,(%bx) # ASCII value to 8> movw $0xb801,%bx # Video Memory address 9> movb $0x1f,(%bx) # Attribute of the 10> loop1: 11> jmp loop1 Hope I have got the concept correctly . Thanking you all for bearing my basic doubts and clearing them too. With best Regards --- Frederic Marmond <fmarmond@eprocess.fr> wrote: > Hi, > > Here are some explainations you may want to know. > > When your PC boots, it is in real mode. > This mode (!= protected mode) manage memory in this > way: > segment+offset > The segment is a 64ko range , step by 16 bytes. > So, if you want to write to b8000 (video memory > start in text mode), you > may set your segment at 0xb800 (=> 0xb800 * 16 = > 0xb8000) > Then, you can adress this segment of 65536 bytes > with an offset of 16bits. > (that's why in real mode you can only see the first > 1Mo of your memory: > 0xFFFF*16 = 0xFFFF0 ~= 1024*1024 (in fact, a > little bit more than 1Mo, > because of the offset of 0xffff max)) > For your problem, in pseudo code: > mov 0x411f to 0xb800:0 (write 0x411f to the > corner high-left) > mov 0x411f to 0xb800:(80*2 *10+ 20*2) (write > 0x411f to the 10th line > (80*2 *10= 80(charPerLine) *2(1char=ascii+attribut) > *10(10th line)) and > 20th char) > > in assembly, segments are stored in special > registers: ds (Data > Segment), CS(Code Segment), Es,Fs,Gs (Extra > Segments), SS(Stack Segment) > Offset may be any of the followings > (Ax,Bx,Cx,Dx,Si,Di,Sp). (and, in > 32bits mode: eAx,eBx,eCx....) > > So, the pseudo code may be write like that ((in > intel syntax, which I > prefer, and that compile with nasm): > mov ax,0xb800 > mov es,ax ; we cannot affect > directly value to seg > register (cannot write mov es,0xb800) > mov bx,0x0 ; start of the segment > mov [es:bx],0x411f ;the compilator will > assume automaticaly movw > (mov word => 16 bits) > > That is what Emanuele wrote you (in At&t syntax): > > movw $0xB800, %ax > movw %ax, %es ; affect the start > adress to the segment > movb $0x41, %es:0 ; store value in > the video memory > movb $0x1f, %es:1 ; these 2 lines > may be = to movw $0x411f,%es:0 > > > hope it helps! > > Fred > > Anticipating a Reply wrote: > > >Hello Emanuele , > > > > Thank you for the below code > >you sent . It works perfectly and > >will help me learn more of assembly . > > > > Can you please help me figure > >out where I'am wrong in the code below, > >which I have witten for the same > >functionality . > > > >.code16 > > > >.globl _start > > > >_start: > > movw $0xb800,%bx # Video Memory address > > movb $0x41,(%bx) # ASCII value to be > displayed > > > > > > movw $0xb801,%bx # Video Memory address > > movb $0x1f,(%bx) # Attribute of the > Character > >loop1: > > jmp loop1 > > > > > > Thanks once again . > > > >With Best Regards > > > > --- Emanuele Altieri <ealtieri@hampshire.edu> > wrote: > > > > > >>I'm assuming that you want to keep your code as a > >>boot program: > >> > >> .code16 # needed for > >>booting > >> .global _start > >> _start: > >> movw $0xB800, %ax > >> movw %ax, %es > >> movb $0x41, %es:0 > >> movb $0x1f, %es:1 > >> loop1: jmp loop1 > >> > >> > >>To assembly and link the program: > >> > >> as -o boot.o boot.s > >> ld -s -oformat binary -Ttext 0x0 -o boot boot.o > >> > >>The last command creates the "boot" file that is > >>ready to be > >>installed in the first sector of the floppy disk: > >> > >> dd seek=0 if=boot of=/dev/fd0 > >> > >> > >>Hope this helps > >> > >> -Emanuele > >> > >> > >>On Tue, 2002-07-30 at 07:59, Anticipating a Reply > >>wrote: > >> > >> > >>>Hi Everybody, > >>> > >>> I have got a small piece of Assembly code > >>> > >>> > >>, > >> > >> > >>>which writes a character "A" on the screen . > >>> > >>> The below program is compiled and written > >>>to the boot sector of a floppy. It compiles > >>>using the command : > >>> > >>> as86 boot.s -o boot.o > >>> ld86 -d boot.o -o boot > >>> > >>> I want to rewrite it in AT&T syntax and > >>>want to use GNU "as" assembler to compile it . > >>>I tried doing it ,but with no success . > >>> > >>> Can anybody please help me rewite the > >>>below code in AT&T syntax and tell me how > >>>to compile & link it ? > >>> > >>> Thanks in Advance . > >>> > >>>With Best Regards > >>> > >>> > >>>THE CODE : > >>>------------ > >>> > >>> > >>>entry start > >>> > >>>start: > >>> mov ax,#0xb800 ; Video Memory address is > >>> > >>> > >>0xb800 > >> > >> > >>> > >>> mov es,ax ; Video Memory is made as > >>> > >>> > >>Extra > >> > >> > >>>Segment > >>> seg es ; Makes next instruction > >>> > >>> > >>execute > >> > >> > >>>wrt Extra Segment > >>> mov [0],#0x41 ; ASCII value of the > >>> > >>> > >>Character > >> > >> > >>>to be displayed > >>> ; in 1-row & 1-column > >>> seg es ; Makes next instruction > >>> > >>> > >>execute > >> > >> > >>>wrt Extra Segment > >>> mov [1],#0x1f ; Attribute of the > Character > >>> > >>> > >>to > >> > >> > >>>be displayed > >>> ; in 1-row & 1-column > >>> ; 0x1f represents White > >>>Character on a Blue Background > >>>loop1: > >>> jmp loop1 > >>> > >>> > >>> > >>> > >>> > >________________________________________________________________________ > > > > > >>>Want to sell your car? advertise on Yahoo Autos > >>> > >>> > >>Classifieds. It's Free!! > >> > >> > >>> visit http://in.autos.yahoo.com > >>>- > >>>To unsubscribe from this list: send the line > >>> > >>> > >>"unsubscribe linux-assembly" in > >> > >> > >>>the body of a message to > majordomo@vger.kernel.org > >>>More majordomo info at > >>> > >>> > >>http://vger.kernel.org/majordomo-info.html > >> > >> > >> > >> > >>># boot.s > >>> > >>> > >># > >># To assembly and link as a **boot** program: > >># > >># as boot.s -o boot.o > >># ld -s -oformat binary -Ttext 0x0 -o boot > boot.o > >># > >># To copy it to the boot sector of a floppy disk: > >># > >># dd seek=0 if=boot of=/dev/fd0 > >># > >># --- > >># Emanuele (ealtieri@hampshire.edu) > >> > >> .code16 > >> .global _start > >>_start: > >> movw $0xB800, %ax > >> movw %ax, %es > >> movb $0x41, %es:0 > >> movb $0x1f, %es:1 > >>loop1: jmp loop1 > >> > >> > >> > > > >________________________________________________________________________ > >Want to sell your car? advertise on Yahoo Autos > Classifieds. It's Free!! > > visit http://in.autos.yahoo.com > >- > >To unsubscribe from this list: send the line > "unsubscribe linux-assembly" in > >the body of a message to majordomo@vger.kernel.org > >More majordomo info at > http://vger.kernel.org/majordomo-info.html > > > > > > > > > > - > To unsubscribe from this list: send the line > "unsubscribe linux-assembly" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html ________________________________________________________________________ Want to sell your car? advertise on Yahoo Autos Classifieds. It's Free!! visit http://in.autos.yahoo.com ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: newbie question on gnu 'as' => explaination about the why (for really newbie ;-)) 2002-07-31 10:09 ` Anticipating a Reply @ 2002-07-31 11:31 ` Frederic Marmond 0 siblings, 0 replies; 9+ messages in thread From: Frederic Marmond @ 2002-07-31 11:31 UTC (permalink / raw) To: ruxyz; +Cc: Emanuele Altieri, Linux Assembly List hum, well... I don't use the AT&T syntax, so, I may be wrong, but I think your code is not right again: you don't specify any segment! (only the bx register) So, how do you think the CPU will know where to put your 0x411f ? You have to specify the segment after having fill it with a value. movw 0xb800,%bx movw %bx,%ds movw $0x411f,(%bx) <= I'm not sure (perhapse a AT&T guru may help us) Here, we assume that DS is the default segment token by the as compiler if I take your origin-code: mov ax,#0xb800 ; Video Memory address is 0xb800 mov es,ax ; Video Memory is made as Extra Segment seg es ; Makes next instruction execute wrt Extra Segment mov [0],#0x41 ; ASCII value of the Character to be displayed ; in 1-row & 1-column seg es ; Makes next instruction execute wrt Extra Segment mov [1],#0x1f ; Attribute of the Character to be displayed ; in 1-row & 1-column ; 0x1f represents White The "seg es" lines are what we need. I think that by default, 'ds' is used, so, my 3 lines of code may work. in this: 6> movw $0xb800,%bx # Video Memory address 7> movb $0x41,(%bx) # ASCII value to 8> movw $0xb801,%bx # Video Memory address 9> movb $0x1f,(%bx) # Attribute of the you will put 0x411f at [ds:0xb800], which is somewhere around your program code... it will surely erase something you may need (perhapse your code!) Anticipating a Reply wrote: >Hi Frederic , > > Thank you very much for all the >explanation you have given about the >addressing in 16-bit real mode . > > From this explanation , I think >I was wrong in line number 7 , >which had 0xb800 acting as an >offset to the Data Segment . > > That is,if I'am not wrong we >always need to specify the addresses >in the below format - > > seg_reg:offset >---- > OR >---- > if given as > > movb $xxx , ( %seg_reg ) > >then the contents of "seg_reg" >will be considered as an Offset >with respect to the Data Segment. > > >1> .code16 >2> >3> .globl _start >4> >5> _start: >6> movw $0xb800,%bx # Video Memory address >7> movb $0x41,(%bx) # ASCII value to >8> movw $0xb801,%bx # Video Memory address >9> movb $0x1f,(%bx) # Attribute of the >10> loop1: >11> jmp loop1 > > >Hope I have got the concept correctly . > > Thanking you all for bearing my basic >doubts and clearing them too. > >With best Regards > > > --- Frederic Marmond <fmarmond@eprocess.fr> wrote: > >Hi, > > >>Here are some explainations you may want to know. >> >>When your PC boots, it is in real mode. >>This mode (!= protected mode) manage memory in this >>way: >>segment+offset >>The segment is a 64ko range , step by 16 bytes. >>So, if you want to write to b8000 (video memory >>start in text mode), you >>may set your segment at 0xb800 (=> 0xb800 * 16 = >>0xb8000) >>Then, you can adress this segment of 65536 bytes >>with an offset of 16bits. >>(that's why in real mode you can only see the first >>1Mo of your memory: >>0xFFFF*16 = 0xFFFF0 ~= 1024*1024 (in fact, a >>little bit more than 1Mo, >>because of the offset of 0xffff max)) >>For your problem, in pseudo code: >>mov 0x411f to 0xb800:0 (write 0x411f to the >>corner high-left) >>mov 0x411f to 0xb800:(80*2 *10+ 20*2) (write >>0x411f to the 10th line >>(80*2 *10= 80(charPerLine) *2(1char=ascii+attribut) >>*10(10th line)) and >>20th char) >> >>in assembly, segments are stored in special >>registers: ds (Data >>Segment), CS(Code Segment), Es,Fs,Gs (Extra >>Segments), SS(Stack Segment) >>Offset may be any of the followings >>(Ax,Bx,Cx,Dx,Si,Di,Sp). (and, in >>32bits mode: eAx,eBx,eCx....) >> >>So, the pseudo code may be write like that ((in >>intel syntax, which I >>prefer, and that compile with nasm): >>mov ax,0xb800 >>mov es,ax ; we cannot affect >>directly value to seg >>register (cannot write mov es,0xb800) >>mov bx,0x0 ; start of the segment >>mov [es:bx],0x411f ;the compilator will >>assume automaticaly movw >>(mov word => 16 bits) >> >>That is what Emanuele wrote you (in At&t syntax): >> >> movw $0xB800, %ax >> movw %ax, %es ; affect the start >>adress to the segment >> movb $0x41, %es:0 ; store value in >>the video memory >> movb $0x1f, %es:1 ; these 2 lines >>may be = to movw $0x411f,%es:0 >> >> >>hope it helps! >> >>Fred >> >>Anticipating a Reply wrote: >> >> >> >>>Hello Emanuele , >>> >>> Thank you for the below code >>>you sent . It works perfectly and >>>will help me learn more of assembly . >>> >>> Can you please help me figure >>>out where I'am wrong in the code below, >>>which I have witten for the same >>>functionality . >>> >>>.code16 >>> >>>.globl _start >>> >>>_start: >>> movw $0xb800,%bx # Video Memory address >>> movb $0x41,(%bx) # ASCII value to be >>> >>> >>displayed >> >> >>> movw $0xb801,%bx # Video Memory address >>> movb $0x1f,(%bx) # Attribute of the >>> >>> >>Character >> >> >>>loop1: >>> jmp loop1 >>> >>> >>> Thanks once again . >>> >>>With Best Regards >>> >>>--- Emanuele Altieri <ealtieri@hampshire.edu> >>> >>> >>wrote: >> >> >>> >>> >>> >>> >>>>I'm assuming that you want to keep your code as a >>>>boot program: >>>> >>>> .code16 # needed for >>>>booting >>>> .global _start >>>> _start: >>>> movw $0xB800, %ax >>>> movw %ax, %es >>>> movb $0x41, %es:0 >>>> movb $0x1f, %es:1 >>>> loop1: jmp loop1 >>>> >>>> >>>>To assembly and link the program: >>>> >>>> as -o boot.o boot.s >>>> ld -s -oformat binary -Ttext 0x0 -o boot boot.o >>>> >>>>The last command creates the "boot" file that is >>>>ready to be >>>>installed in the first sector of the floppy disk: >>>> >>>> dd seek=0 if=boot of=/dev/fd0 >>>> >>>> >>>>Hope this helps >>>> >>>> -Emanuele >>>> >>>> >>>>On Tue, 2002-07-30 at 07:59, Anticipating a Reply >>>>wrote: >>>> >>>> >>>> >>>> >>>>>Hi Everybody, >>>>> >>>>> I have got a small piece of Assembly code >>>>> >>>>> >>>>> >>>>> >>>>, >>>> >>>> >>>> >>>> >>>>>which writes a character "A" on the screen . >>>>> >>>>> The below program is compiled and written >>>>>to the boot sector of a floppy. It compiles >>>>>using the command : >>>>> >>>>> as86 boot.s -o boot.o >>>>> ld86 -d boot.o -o boot >>>>> >>>>> I want to rewrite it in AT&T syntax and >>>>>want to use GNU "as" assembler to compile it . >>>>>I tried doing it ,but with no success . >>>>> >>>>> Can anybody please help me rewite the >>>>>below code in AT&T syntax and tell me how >>>>>to compile & link it ? >>>>> >>>>> Thanks in Advance . >>>>> >>>>>With Best Regards >>>>> >>>>> >>>>>THE CODE : >>>>>------------ >>>>> >>>>> >>>>>entry start >>>>> >>>>>start: >>>>> mov ax,#0xb800 ; Video Memory address is >>>>> >>>>> >>>>> >>>>> >>>>0xb800 >>>> >>>> >>>> >>>> >>>>> >>>>> mov es,ax ; Video Memory is made as >>>>> >>>>> >>>>> >>>>> >>>>Extra >>>> >>>> >>>> >>>> >>>>>Segment >>>>> seg es ; Makes next instruction >>>>> >>>>> >>>>> >>>>> >>>>execute >>>> >>>> >>>> >>>> >>>>>wrt Extra Segment >>>>> mov [0],#0x41 ; ASCII value of the >>>>> >>>>> >>>>> >>>>> >>>>Character >>>> >>>> >>>> >>>> >>>>>to be displayed >>>>> ; in 1-row & 1-column >>>>> seg es ; Makes next instruction >>>>> >>>>> >>>>> >>>>> >>>>execute >>>> >>>> >>>> >>>> >>>>>wrt Extra Segment >>>>> mov [1],#0x1f ; Attribute of the >>>>> >>>>> >>Character >> >> >>>>> >>>>> >>>>> >>>>> >>>>to >>>> >>>> >>>> >>>> >>>>>be displayed >>>>> ; in 1-row & 1-column >>>>> ; 0x1f represents White >>>>>Character on a Blue Background >>>>>loop1: >>>>> jmp loop1 >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>________________________________________________________________________ >> >> >>> >>> >>> >>> >>>>>Want to sell your car? advertise on Yahoo Autos >>>>> >>>>> >>>>> >>>>> >>>>Classifieds. It's Free!! >>>> >>>> >>>> >>>> >>>>> visit http://in.autos.yahoo.com >>>>>- >>>>>To unsubscribe from this list: send the line >>>>> >>>>> >>>>> >>>>> >>>>"unsubscribe linux-assembly" in >>>> >>>> >>>> >>>> >>>>>the body of a message to >>>>> >>>>> >>majordomo@vger.kernel.org >> >> >>>>>More majordomo info at >>>>> >>>>> >>>>> >>>>> >>>>http://vger.kernel.org/majordomo-info.html >>>> >>>> >>>> >>>> >>>> >>>> >>>>># boot.s >>>>> >>>>> >>>>> >>>>> >>>># >>>># To assembly and link as a **boot** program: >>>># >>>># as boot.s -o boot.o >>>># ld -s -oformat binary -Ttext 0x0 -o boot >>>> >>>> >>boot.o >> >> >>>># >>>># To copy it to the boot sector of a floppy disk: >>>># >>>># dd seek=0 if=boot of=/dev/fd0 >>>># >>>># --- >>>># Emanuele (ealtieri@hampshire.edu) >>>> >>>> .code16 >>>> .global _start >>>>_start: >>>> movw $0xB800, %ax >>>> movw %ax, %es >>>> movb $0x41, %es:0 >>>> movb $0x1f, %es:1 >>>>loop1: jmp loop1 >>>> >>>> >>>> >>>> >>>> >>________________________________________________________________________ >> >> >>>Want to sell your car? advertise on Yahoo Autos >>> >>> >>Classifieds. It's Free!! >> >> >>> visit http://in.autos.yahoo.com >>>- >>>To unsubscribe from this list: send the line >>> >>> >>"unsubscribe linux-assembly" in >> >> >>>the body of a message to majordomo@vger.kernel.org >>>More majordomo info at >>> >>> >>http://vger.kernel.org/majordomo-info.html >> >> >>> >>> >>> >>> >> >>- >>To unsubscribe from this list: send the line >>"unsubscribe linux-assembly" in >>the body of a message to majordomo@vger.kernel.org >>More majordomo info at >> >> >http://vger.kernel.org/majordomo-info.html > >________________________________________________________________________ >Want to sell your car? advertise on Yahoo Autos Classifieds. It's Free!! > visit http://in.autos.yahoo.com > > > ^ permalink raw reply [flat|nested] 9+ messages in thread
[parent not found: <3D47BC4C.2050001@eprocess.fr>]
* Re: newbie question on gnu 'as' => explaination about the why (for really newbie ;-)) [not found] <3D47BC4C.2050001@eprocess.fr> @ 2002-08-01 4:43 ` Anticipating a Reply 0 siblings, 0 replies; 9+ messages in thread From: Anticipating a Reply @ 2002-08-01 4:43 UTC (permalink / raw) To: fmarmond; +Cc: Emanuele Altieri, Linux Assembly List Hi Frederic , Thanks again . Let me do some more investigation and study before I ask anymore questions on AT&T syntax and Assembly . With Best Regards --- Frederic Marmond <fmarmond@eprocess.fr> wrote: > hum, well... > I don't use the AT&T syntax, so, I may be wrong, but > I think your code > is not right again: > you don't specify any segment! (only the bx > register) > So, how do you think the CPU will know where to put > your 0x411f ? > You have to specify the segment after having fill it > with a value. > movw 0xb800,%bx > movw %bx,%ds > movw $0x411f,(%bx) <= I'm not sure (perhapse > a AT&T guru may help us) > Here, we > assume that DS is > the default segment token by the as compiler > > if I take your origin-code: > > mov ax,#0xb800 ; Video Memory address is > 0xb800 > mov es,ax ; Video Memory is made as > Extra Segment > seg es ; Makes next instruction > execute wrt Extra Segment > mov [0],#0x41 ; ASCII value of the Character > to be displayed > ; in 1-row & 1-column > seg es ; Makes next instruction > execute wrt Extra Segment > mov [1],#0x1f ; Attribute of the Character > to be displayed > ; in 1-row & 1-column > ; 0x1f represents White > > > The "seg es" lines are what we need. > I think that by default, 'ds' is used, so, my 3 > lines of code may work. > > > in this: > > 6> movw $0xb800,%bx # Video Memory address > 7> movb $0x41,(%bx) # ASCII value to > 8> movw $0xb801,%bx # Video Memory address > > 9> movb $0x1f,(%bx) # Attribute of the > > you will put 0x411f at [ds:0xb800], which is > somewhere around your > program code... it will surely erase something you > may need (perhapse > your code!) > > > > > Anticipating a Reply wrote: > > >Hi Frederic , > > > > Thank you very much for all the > >explanation you have given about the > >addressing in 16-bit real mode . > > > > From this explanation , I think > >I was wrong in line number 7 , > >which had 0xb800 acting as an > >offset to the Data Segment . > > > > That is,if I'am not wrong we > >always need to specify the addresses > >in the below format - > > > > seg_reg:offset > >---- > > OR > >---- > > if given as > > > > movb $xxx , ( %seg_reg ) > > > >then the contents of "seg_reg" > >will be considered as an Offset > >with respect to the Data Segment. > > > > > >1> .code16 > >2> > >3> .globl _start > >4> > >5> _start: > >6> movw $0xb800,%bx # Video Memory address > > >7> movb $0x41,(%bx) # ASCII value to > >8> movw $0xb801,%bx # Video Memory address > > >9> movb $0x1f,(%bx) # Attribute of the > >10> loop1: > >11> jmp loop1 > > > > > >Hope I have got the concept correctly . > > > > Thanking you all for bearing my basic > >doubts and clearing them too. > > > >With best Regards > > > > > > --- Frederic Marmond <fmarmond@eprocess.fr> wrote: > > > >Hi, > > > > > >>Here are some explainations you may want to know. > >> > >>When your PC boots, it is in real mode. > >>This mode (!= protected mode) manage memory in > this > >>way: > >>segment+offset > >>The segment is a 64ko range , step by 16 bytes. > >>So, if you want to write to b8000 (video memory > >>start in text mode), you > >>may set your segment at 0xb800 (=> 0xb800 * 16 = > >>0xb8000) > >>Then, you can adress this segment of 65536 bytes > >>with an offset of 16bits. > >>(that's why in real mode you can only see the > first > >>1Mo of your memory: > >>0xFFFF*16 = 0xFFFF0 ~= 1024*1024 (in fact, a > >>little bit more than 1Mo, > >>because of the offset of 0xffff max)) > >>For your problem, in pseudo code: > >>mov 0x411f to 0xb800:0 (write 0x411f to the > >>corner high-left) > >>mov 0x411f to 0xb800:(80*2 *10+ 20*2) (write > >>0x411f to the 10th line > >>(80*2 *10= 80(charPerLine) > *2(1char=ascii+attribut) > >>*10(10th line)) and > >>20th char) > >> > >>in assembly, segments are stored in special > >>registers: ds (Data > >>Segment), CS(Code Segment), Es,Fs,Gs (Extra > >>Segments), SS(Stack Segment) > >>Offset may be any of the followings > >>(Ax,Bx,Cx,Dx,Si,Di,Sp). (and, in > >>32bits mode: eAx,eBx,eCx....) > >> > >>So, the pseudo code may be write like that ((in > >>intel syntax, which I > >>prefer, and that compile with nasm): > >>mov ax,0xb800 > >>mov es,ax ; we cannot affect > >>directly value to seg > >>register (cannot write mov es,0xb800) > >>mov bx,0x0 ; start of the segment > >>mov [es:bx],0x411f ;the compilator will > >>assume automaticaly movw > >>(mov word => 16 bits) > >> > >>That is what Emanuele wrote you (in At&t syntax): > >> > >> movw $0xB800, %ax > >> movw %ax, %es ; affect the start > >>adress to the segment > >> movb $0x41, %es:0 ; store value > in > >>the video memory > >> movb $0x1f, %es:1 ; these 2 > lines > >>may be = to movw $0x411f,%es:0 > >> > >> > >>hope it helps! > >> > >>Fred > >> > >>Anticipating a Reply wrote: > >> > >> > >> > >>>Hello Emanuele , > >>> > >>> Thank you for the below code > >>>you sent . It works perfectly and > >>>will help me learn more of assembly . > >>> > >>> Can you please help me figure > >>>out where I'am wrong in the code below, > >>>which I have witten for the same > >>>functionality . > >>> > >>>.code16 > >>> > >>>.globl _start > >>> > >>>_start: > >>> movw $0xb800,%bx # Video Memory address > >>> movb $0x41,(%bx) # ASCII value to be > >>> > >>> > >>displayed > >> > >> > >>> movw $0xb801,%bx # Video Memory address > > >>> movb $0x1f,(%bx) # Attribute of the > >>> > >>> > >>Character > >> > >> > >>>loop1: > >>> jmp loop1 > >>> > >>> > >>> Thanks once again . > >>> > >>>With Best Regards > >>> > >>>--- Emanuele Altieri <ealtieri@hampshire.edu> > >>> > >>> > >>wrote: > >> > >> > >>> > >>> > >>> > >>> > >>>>I'm assuming that you want to keep your code as > a > >>>>boot program: > >>>> > >>>> .code16 # needed for > >>>>booting > >>>> .global _start > >>>> _start: > >>>> movw $0xB800, %ax > >>>> movw %ax, %es > >>>> movb $0x41, %es:0 > >>>> movb $0x1f, %es:1 > >>>> loop1: jmp loop1 > >>>> > >>>> > >>>>To assembly and link the program: > >>>> > >>>> as -o boot.o boot.s > >>>> ld -s -oformat binary -Ttext 0x0 -o boot > boot.o > >>>> > >>>>The last command creates the "boot" file that is > >>>>ready to be > >>>>installed in the first sector of the floppy > disk: > >>>> > >>>> dd seek=0 if=boot of=/dev/fd0 > >>>> > >>>> > >>>>Hope this helps > >>>> > >>>> -Emanuele > >>>> > >>>> > >>>>On Tue, 2002-07-30 at 07:59, Anticipating a > Reply > >>>>wrote: > >>>> > >>>> > >>>> > >>>> > >>>>>Hi Everybody, > >>>>> > >>>>> I have got a small piece of Assembly > code > >>>>> > >>>>> > >>>>> > >>>>> > >>>>, > >>>> > >>>> > >>>> > >>>> > >>>>>which writes a character "A" on the screen . > >>>>> > >>>>> The below program is compiled and written > >>>>>to the boot sector of a floppy. It compiles > >>>>>using the command : > >>>>> > >>>>> as86 boot.s -o boot.o > >>>>> ld86 -d boot.o -o boot > >>>>> > >>>>> I want to rewrite it in AT&T syntax and > >>>>>want to use GNU "as" assembler to compile it . > >>>>>I tried doing it ,but with no success . > >>>>> > >>>>> Can anybody please help me rewite the > >>>>>below code in AT&T syntax and tell me how > >>>>>to compile & link it ? > >>>>> > >>>>> Thanks in Advance . > >>>>> > >>>>>With Best Regards > >>>>> > >>>>> > >>>>>THE CODE : > >>>>>------------ > >>>>> > >>>>> > >>>>>entry start > >>>>> > >>>>>start: > >>>>> mov ax,#0xb800 ; Video Memory address is > >>>>> > >>>>> > >>>>> > >>>>> > >>>>0xb800 > >>>> > >>>> > >>>> > >>>> > >>>>> > >>>>> mov es,ax ; Video Memory is made as > >>>>> > >>>>> > >>>>> > >>>>> > >>>>Extra > >>>> > >>>> > >>>> > >>>> > >>>>>Segment > >>>>> seg es ; Makes next instruction > >>>>> > >>>>> > >>>>> > >>>>> > >>>>execute > >>>> > >>>> > >>>> > >>>> > >>>>>wrt Extra Segment > >>>>> mov [0],#0x41 ; ASCII value of the > >>>>> > >>>>> > >>>>> > >>>>> > >>>>Character > >>>> > >>>> > >>>> > >>>> > >>>>>to be displayed > >>>>> ; in 1-row & 1-column > >>>>> seg es ; Makes next instruction > >>>>> > >>>>> > >>>>> > >>>>> > >>>>execute > >>>> > >>>> > >>>> > >>>> > >>>>>wrt Extra Segment > >>>>> mov [1],#0x1f ; Attribute of the > >>>>> > >>>>> > >>Character > >> > >> > >>>>> > >>>>> > >>>>> > >>>>> > >>>>to > >>>> > >>>> > >>>> > >>>> > >>>>>be displayed > >>>>> ; in 1-row & 1-column > >>>>> ; 0x1f represents White > >>>>>Character on a Blue Background > >>>>>loop1: > >>>>> jmp loop1 > >>>>> > >>>>> > >>>>> > >>>>> > >>>>> > >>>>> > >>>>> > >>________________________________________________________________________ > >> > >> > >>> > >>> > >>> > >>> > >>>>>Want to sell your car? advertise on Yahoo Autos > >>>>> > >>>>> > >>>>> > >>>>> > >>>>Classifieds. It's Free!! > >>>> > >>>> > >>>> > >>>> > >>>>> visit http://in.autos.yahoo.com > >>>>>- > >>>>>To unsubscribe from this list: send the line > >>>>> > >>>>> > >>>>> > >>>>> > >>>>"unsubscribe linux-assembly" in > >>>> > >>>> > >>>> > >>>> > >>>>>the body of a message to > >>>>> > >>>>> > >>majordomo@vger.kernel.org > >> > >> > >>>>>More majordomo info at > >>>>> > >>>>> > >>>>> > >>>>> > >>>>http://vger.kernel.org/majordomo-info.html > >>>> > >>>> > >>>> > >>>> > >>>> > >>>> > >>>>># boot.s > >>>>> > >>>>> > >>>>> > >>>>> > >>>># > >>>># To assembly and link as a **boot** program: > >>>># > >>>># as boot.s -o boot.o > >>>># ld -s -oformat binary -Ttext 0x0 -o boot > >>>> > >>>> > >>boot.o > >> > >> > >>>># > >>>># To copy it to the boot sector of a floppy > disk: > >>>># > >>>># dd seek=0 if=boot of=/dev/fd0 > >>>># > >>>># --- > >>>># Emanuele (ealtieri@hampshire.edu) > >>>> > >>>> .code16 > >>>> .global _start > >>>>_start: > >>>> movw $0xB800, %ax > >>>> movw %ax, %es > >>>> movb $0x41, %es:0 > >>>> movb $0x1f, %es:1 > >>>>loop1: jmp loop1 > >>>> > >>>> > >>>> > >>>> > >>>> > >>________________________________________________________________________ > >> > >> > >>>Want to sell your car? advertise on Yahoo Autos > >>> > >>> > >>Classifieds. It's Free!! > >> > >> > >>> visit http://in.autos.yahoo.com > >>>- > >>>To unsubscribe from this list: send the line > >>> > >>> > >>"unsubscribe linux-assembly" in > >> > >> > >>>the body of a message to > majordomo@vger.kernel.org > >>>More majordomo info at > >>> > >>> > >>http://vger.kernel.org/majordomo-info.html > >> > >> > >>> > >>> > >>> > >>> > >> > >>- > >>To unsubscribe from this list: send the line > >>"unsubscribe linux-assembly" in > >>the body of a message to majordomo@vger.kernel.org > >>More majordomo info at > >> > >> > >http://vger.kernel.org/majordomo-info.html > > > >________________________________________________________________________ > >Want to sell your car? advertise on Yahoo Autos > Classifieds. It's Free!! > > visit http://in.autos.yahoo.com > > > > > > > > > ________________________________________________________________________ Want to sell your car? advertise on Yahoo Autos Classifieds. It's Free!! visit http://in.autos.yahoo.com ^ permalink raw reply [flat|nested] 9+ messages in thread
[parent not found: <1028179746.1936.35.camel@italia>]
* Re: newbie question on gnu 'as' => explaination about the why (for really newbie ;-)) [not found] <1028179746.1936.35.camel@italia> @ 2002-08-01 12:09 ` Anticipating a Reply 0 siblings, 0 replies; 9+ messages in thread From: Anticipating a Reply @ 2002-08-01 12:09 UTC (permalink / raw) To: Emanuele Altieri; +Cc: Linux Assembly List Hello Emanuele , Thank you very much for the explanation given by you , which has cleared my doubt about 16-bit mode addressing totally . Actually , I was fooled by the Video memory address 0xb800 which is loaded into the segment register in the orignal code . Now I understand that its lower 4 bits are left-shifted & the offset is added to produce the 20 bit address . Thanks again for the help . With Best Regards --- Emanuele Altieri <ealtieri@hampshire.edu> wrote: > Hi, > > My reply comes a bit late. I hope it is still > helpful. > This is the code that you wrote: > > .code16 > .globl _start > _start: > movw $0xb800,%bx # Video Memory address > movb $0x41,(%bx) # ASCII value to be > displayed > movw $0xb801,%bx # Video Memory address > movb $0x1f,(%bx) # Attribute of the > loop1: jmp loop1 > > The problem with the code above is that it is > writing to memory address > 0xB800 rather than 0xB8000 (notice the extra zero), > where video memory > is actually located. The (%bx) notation means write > to (or read from) > memory at the address specified in %bx, and in %bx > we have 0xB800. > > Now, how can we make it write to 0xB8000 instead? > The problem with this > address is that we can't make it fit in a real-mode > register, such as > %bx, because the register can only hold two bytes of > data. > To overcome this limitation, Intel provides us with > segment registers > (es, ds, fs, gs). You can address memory by > combining one of these > registers with %bx. For example: > > mov $SOME_VALUE, %es:(%bx) > > The memory address to write to is calculated by > multiplying %es by 16 > and adding %bx to it. So, if we have > > # %es = $0xB800 > # %bx = $0 > mov $SOME_VALUE, %es:(%bx) # write to > 0xB8000 > > the final address is calculated as following: > > B800 (value in %es * 16) > + 0000 (value in %bx ) > ===== > B8000 > > that is the address that we want. > > You can learn more on real-mode addressing and > segmentation from the > 16-bit edition of the Art Of Assembly Language, > section 4.3. Follow the > link below: > > http://webster.cs.ucr.edu/Page_asm/ArtofAssembly/ch04/CH04-1.html#HEADING1-64 > > The whole chapter 4 is very interesting. > > If you want to find out more about the AT&T's > addressing modes, there > are many tutorials on the linuxassembly.org site, > such as this: > > http://www.linuxassembly.org/linasm.html > > > Take care > > -Emanuele > > > > On Thu, 2002-08-01 at 00:43, Anticipating a Reply > wrote: > > Hi Frederic , > > > > Thanks again . > > > > Let me do some more investigation and > > study before I ask anymore questions on > > AT&T syntax and Assembly . > > > > With Best Regards > > > > --- Frederic Marmond <fmarmond@eprocess.fr> > wrote: > > > hum, well... > > > I don't use the AT&T syntax, so, I may be wrong, > but > > > I think your code > > > is not right again: > > > you don't specify any segment! (only the bx > > > register) > > > So, how do you think the CPU will know where to > put > > > your 0x411f ? > > > You have to specify the segment after having > fill it > > > with a value. > > > movw 0xb800,%bx > > > movw %bx,%ds > > > movw $0x411f,(%bx) <= I'm not sure > (perhapse > > > a AT&T guru may help us) > > > > Here, we > > > assume that DS is > > > the default segment token by the as compiler > > > > > > if I take your origin-code: > > > > > > mov ax,#0xb800 ; Video Memory address is > > > 0xb800 > > > mov es,ax ; Video Memory is made as > > > Extra Segment > > > seg es ; Makes next instruction > > > execute wrt Extra Segment > > > mov [0],#0x41 ; ASCII value of the > Character > > > to be displayed > > > ; in 1-row & 1-column > > > seg es ; Makes next instruction > > > execute wrt Extra Segment > > > mov [1],#0x1f ; Attribute of the > Character > > > to be displayed > > > ; in 1-row & 1-column > > > ; 0x1f represents White > > > > > > > > > The "seg es" lines are what we need. > > > I think that by default, 'ds' is used, so, my 3 > > > lines of code may work. > > > > > > > > > in this: > > > > > > 6> movw $0xb800,%bx # Video Memory > address > > > 7> movb $0x41,(%bx) # ASCII value to > > > 8> movw $0xb801,%bx # Video Memory > address > > > > > > 9> movb $0x1f,(%bx) # Attribute of the > > > > > > you will put 0x411f at [ds:0xb800], which is > > > somewhere around your > > > program code... it will surely erase something > you > > > may need (perhapse > > > your code!) > > > > > > > > > > > > > > > Anticipating a Reply wrote: > > > > > > >Hi Frederic , > > > > > > > > Thank you very much for all the > > > >explanation you have given about the > > > >addressing in 16-bit real mode . > > > > > > > > From this explanation , I think > > > >I was wrong in line number 7 , > > > >which had 0xb800 acting as an > > > >offset to the Data Segment . > > > > > > > > That is,if I'am not wrong we > > > >always need to specify the addresses > > > >in the below format - > > > > > > > > seg_reg:offset > > > >---- > > > > OR > > > >---- > > > > if given as > > > > > > > > movb $xxx , ( %seg_reg ) > > > > > > > >then the contents of "seg_reg" > > > >will be considered as an Offset > > > >with respect to the Data Segment. > > > > > > > > > > > >1> .code16 > > > >2> > > > >3> .globl _start > > > >4> > > > >5> _start: > > > >6> movw $0xb800,%bx # Video Memory > address > > > > > > >7> movb $0x41,(%bx) # ASCII value to > > > >8> movw $0xb801,%bx # Video Memory > address > > > > > > >9> movb $0x1f,(%bx) # Attribute of the > > > >10> loop1: > > > >11> jmp loop1 > > > > > > > > > > > >Hope I have got the concept correctly . > > > > > > > > Thanking you all for bearing my basic > > > >doubts and clearing them too. > > > > > > > >With best Regards > > > > > > > > > > > > --- Frederic Marmond <fmarmond@eprocess.fr> > wrote: > > > > > > > >Hi, > > > > > > > > > > > >>Here are some explainations you may want to > know. > > > >> > > > >>When your PC boots, it is in real mode. > > > >>This mode (!= protected mode) manage memory in > > > this > > > >>way: > > > >>segment+offset > > > >>The segment is a 64ko range , step by 16 > bytes. > > > >>So, if you want to write to b8000 (video > memory > > > >>start in text mode), you > > > >>may set your segment at 0xb800 (=> 0xb800 * 16 > = > > > >>0xb8000) > > > >>Then, you can adress this segment of 65536 > bytes > > > >>with an offset of 16bits. > > > >>(that's why in real mode you can only see the > > > first > > > >>1Mo of your memory: > > > >>0xFFFF*16 = 0xFFFF0 ~= 1024*1024 (in fact, a > > > >>little bit more than 1Mo, > > > >>because of the offset of 0xffff max)) > > > >>For your problem, in pseudo code: > > > >>mov 0x411f to 0xb800:0 (write 0x411f to the > > > >>corner high-left) > > > >>mov 0x411f to 0xb800:(80*2 *10+ 20*2) > (write > > > >>0x411f to the 10th line > > > >>(80*2 *10= 80(charPerLine) > > > *2(1char=ascii+attribut) > > > >>*10(10th line)) and > > > >>20th char) > > > >> > > > >>in assembly, segments are stored in special > > > >>registers: ds (Data > > > >>Segment), CS(Code Segment), Es,Fs,Gs (Extra > > > >>Segments), SS(Stack Segment) > > > >>Offset may be any of the followings > > > >>(Ax,Bx,Cx,Dx,Si,Di,Sp). (and, in > > > >>32bits mode: eAx,eBx,eCx....) > > > >> > > > >>So, the pseudo code may be write like that > ((in > > > >>intel syntax, which I > > > >>prefer, and that compile with nasm): > > > >>mov ax,0xb800 > > > >>mov es,ax ; we cannot affect > > > >>directly value to seg > > > >>register (cannot write mov es,0xb800) > > > >>mov bx,0x0 ; start of the > segment > > > >>mov [es:bx],0x411f ;the compilator will > > > >>assume automaticaly movw > > > >>(mov word => 16 bits) > > > >> > > > >>That is what Emanuele wrote you (in At&t > syntax): > > > >> > > > >> movw $0xB800, %ax > > > >> movw %ax, %es ; affect the > start > > > >>adress to the segment > > > >> movb $0x41, %es:0 ; store > value > > > in > > > >>the video memory > > > >> movb $0x1f, %es:1 ; these 2 > > > lines > > > >>may be = to movw $0x411f,%es:0 > > > >> > > > >> > > > >>hope it helps! > > > >> > > > >>Fred > > > >> > > > >>Anticipating a Reply wrote: > > > >> > > > >> > > > >> > > > >>>Hello Emanuele , > > > >>> > > > >>> Thank you for the below code > > > >>>you sent . It works perfectly and > > > >>>will help me learn more of assembly . > > > >>> > > > >>> Can you please help me figure > > > >>>out where I'am wrong in the code below, > > > >>>which I have witten for the same > > > >>>functionality . > > > >>> > > > >>>.code16 > > > >>> > > > >>>.globl _start > > > >>> > > > >>>_start: > > > >>> movw $0xb800,%bx # Video Memory > address > > > >>> movb $0x41,(%bx) # ASCII value to be > > > >>> > > > >>> > > > >>displayed > > > >> > > > >> > > > >>> movw $0xb801,%bx # Video Memory > address > > > > > > >>> movb $0x1f,(%bx) # Attribute of the > > > >>> > > > >>> > > > >>Character > > > >> > > > >> > > > >>>loop1: > > > >>> jmp loop1 > > > >>> > > > >>> > > > >>> Thanks once again . > > > >>> > > > >>>With Best Regards > > > >>> > > > >>>--- Emanuele Altieri <ealtieri@hampshire.edu> > > > >>> > > > >>> > > > >>wrote: > > > >> > > > >> > > > >>> > > > >>> > > > >>> > > > >>> > > > >>>>I'm assuming that you want to keep your code > as > > > a > > > >>>>boot program: > > > >>>> > > > >>>> .code16 # needed for > > > >>>>booting > > > >>>> .global _start > > > >>>> _start: > > > >>>> movw $0xB800, %ax > > > >>>> movw %ax, %es > > > >>>> movb $0x41, %es:0 > > > >>>> movb $0x1f, %es:1 > > > >>>> loop1: jmp loop1 > > > >>>> > > > >>>> > > > >>>>To assembly and link the program: > > > >>>> > > > >>>> as -o boot.o boot.s > > > >>>> ld -s -oformat binary -Ttext 0x0 -o boot > > > boot.o > > > >>>> > > > >>>>The last command creates the "boot" file > that is > > > >>>>ready to be > > > >>>>installed in the first sector of the floppy > > > disk: > > > >>>> > > > >>>> dd seek=0 if=boot of=/dev/fd0 > > > >>>> > > > >>>> > > > >>>>Hope this helps > > > >>>> > > > >>>> -Emanuele > > > >>>> > > > >>>> > > > >>>>On Tue, 2002-07-30 at 07:59, Anticipating a > > > Reply > > > >>>>wrote: > > > >>>> > > > >>>> > > > >>>> > > > >>>> > > > >>>>>Hi Everybody, > > > >>>>> > > > >>>>> I have got a small piece of Assembly > > > code > > > >>>>> > > > >>>>> > > > >>>>> > > > >>>>> > > > >>>>, > > > >>>> > > > >>>> > > > >>>> > > > >>>> > > > >>>>>which writes a character "A" on the screen > . > > > >>>>> > > > >>>>> The below program is compiled and written > > > >>>>>to the boot sector of a floppy. It compiles > > > >>>>>using the command : > > > >>>>> > > > >>>>> as86 boot.s -o boot.o > > > >>>>> ld86 -d boot.o -o boot > > > >>>>> > > > >>>>> I want to rewrite it in AT&T syntax and > > > >>>>>want to use GNU "as" assembler to compile > it . > > > >>>>>I tried doing it ,but with no success . > > > >>>>> > > > >>>>> Can anybody please help me rewite the > > > >>>>>below code in AT&T syntax and tell me how > > > >>>>>to compile & link it ? > > > >>>>> > > > >>>>> Thanks in Advance . > > > >>>>> > > > >>>>>With Best Regards > > > >>>>> > > > >>>>> > > > >>>>>THE CODE : > > > >>>>>------------ > > > >>>>> > > > >>>>> > > > >>>>>entry start > > > >>>>> > > > >>>>>start: > > > >>>>> mov ax,#0xb800 ; Video Memory address > is > > > >>>>> > > > >>>>> > > > >>>>> > > > >>>>> > > > >>>>0xb800 > > > >>>> > > > >>>> > > > >>>> > > > >>>> > > > >>>>> > > > >>>>> mov es,ax ; Video Memory is made > as > > > >>>>> > > > >>>>> > > > >>>>> > > > >>>>> > > > >>>>Extra > > > >>>> > > > >>>> > > > >>>> > > > >>>> > > > >>>>>Segment > > > >>>>> seg es ; Makes next > instruction > > > >>>>> > > > >>>>> > > > >>>>> > > > >>>>> > > > >>>>execute > > > >>>> > > > >>>> > > > >>>> > > > >>>> > > > >>>>>wrt Extra Segment > > > >>>>> mov [0],#0x41 ; ASCII value of the > > > >>>>> > > > >>>>> > > > >>>>> > > > >>>>> > > > >>>>Character > > > >>>> > > > >>>> > > > >>>> > > > >>>> > > > >>>>>to be displayed > > > >>>>> ; in 1-row & 1-column > > > >>>>> seg es ; Makes next > instruction > > > >>>>> > > > >>>>> > > > >>>>> > > > >>>>> > > > >>>>execute > > > >>>> > > > >>>> > > > >>>> > > > >>>> > > > >>>>>wrt Extra Segment > > > >>>>> mov [1],#0x1f ; Attribute of the > > > >>>>> > > > >>>>> > > > >>Character > > > >> > > > >> > > > >>>>> > > > >>>>> > > > >>>>> > > > >>>>> > > > >>>>to > > > >>>> > > > >>>> > > > >>>> > > > >>>> > > > >>>>>be displayed > > > >>>>> ; in 1-row & 1-column > > > >>>>> ; 0x1f represents > White > > > >>>>>Character on a Blue Background > > > >>>>>loop1: > > > >>>>> jmp loop1 > > > >>>>> > > > >>>>> > > > >>>>> > > > >>>>> > > > >>>>> > > > >>>>> > > > >>>>> > > > > > > >>________________________________________________________________________ > > > >> > > > >> > > > >>> > > > >>> > > > >>> > > > >>> > > > >>>>>Want to sell your car? advertise on Yahoo > Autos > > > >>>>> > > > >>>>> > > > >>>>> > > > >>>>> > > > >>>>Classifieds. It's Free!! > > > >>>> > > > >>>> > > > >>>> > > > >>>> > > > >>>>> visit http://in.autos.yahoo.com > > > >>>>>- > > > >>>>>To unsubscribe from this list: send the > line > > > >>>>> > > > >>>>> > > > >>>>> > > > >>>>> > > > >>>>"unsubscribe linux-assembly" in > > > >>>> > > > >>>> > > > >>>> > > > >>>> > > > >>>>>the body of a message to > > > >>>>> > > > >>>>> > > > >>majordomo@vger.kernel.org > > > >> > > > >> > > > >>>>>More majordomo info at > > > >>>>> > > > >>>>> > > > >>>>> > > > >>>>> > > > >>>>http://vger.kernel.org/majordomo-info.html > > > >>>> > > > >>>> > > > >>>> > > > >>>> > > > >>>> > > > >>>> > > > >>>>># boot.s > > > >>>>> > > > >>>>> > > > >>>>> > > > >>>>> > > > >>>># > > > >>>># To assembly and link as a **boot** > program: > > > >>>># > > > >>>># as boot.s -o boot.o > > > >>>># ld -s -oformat binary -Ttext 0x0 -o > boot > > > >>>> > > > >>>> > > > >>boot.o > > > >> > > > >> > > > >>>># > > > >>>># To copy it to the boot sector of a floppy > > > disk: > > > >>>># > > > >>>># dd seek=0 if=boot of=/dev/fd0 > > > >>>># > > > >>>># --- > > > >>>># Emanuele (ealtieri@hampshire.edu) > > > >>>> > > > >>>> .code16 > > > >>>> .global _start > > > >>>>_start: > > > >>>> movw $0xB800, %ax > > > >>>> movw %ax, %es > > > >>>> movb $0x41, %es:0 > > > >>>> movb $0x1f, %es:1 > > > >>>>loop1: jmp loop1 > > > >>>> > > > >>>> > > > >>>> > > > >>>> > > > >>>> > > > > > > >>________________________________________________________________________ > > > >> > > > >> > > > >>>Want to sell your car? advertise on Yahoo > Autos > > > >>> > > > >>> > > > >>Classifieds. It's Free!! > > > >> > > > >> > > > >>> visit http://in.autos.yahoo.com > > > >>>- > > > >>>To unsubscribe from this list: send the line > > > >>> > > > >>> > > > >>"unsubscribe linux-assembly" in > > > >> > > > >> > > > >>>the body of a message to > > > majordomo@vger.kernel.org > > > >>>More majordomo info at > > > >>> > > > >>> > > > >>http://vger.kernel.org/majordomo-info.html > > > >> > > > >> > > > >>> > > > >>> > > > >>> > > > >>> > > > >> > > > >>- > > > >>To unsubscribe from this list: send the line > > > >>"unsubscribe linux-assembly" in > > > >>the body of a message to > majordomo@vger.kernel.org > > > >>More majordomo info at > > > >> > > > >> > > > >http://vger.kernel.org/majordomo-info.html > > > > > > > > > > >________________________________________________________________________ > > > >Want to sell your car? advertise on Yahoo Autos > > > Classifieds. It's Free!! > > > > visit http://in.autos.yahoo.com > > > > > > > > > > > > > > > > > > > > > > > > > > ________________________________________________________________________ > > Want to sell your car? advertise on Yahoo Autos > Classifieds. It's Free!! > > visit http://in.autos.yahoo.com > > - > > To unsubscribe from this list: send the line > "unsubscribe linux-assembly" in > > the body of a message to majordomo@vger.kernel.org > > More majordomo info at > http://vger.kernel.org/majordomo-info.html > > ________________________________________________________________________ Want to sell your car? advertise on Yahoo Autos Classifieds. It's Free!! visit http://in.autos.yahoo.com ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2002-08-01 12:09 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2002-07-30 11:59 newbie question on gnu 'as' Anticipating a Reply
2002-07-30 17:24 ` Bruno N. F. Pacheco
2002-07-30 21:34 ` Emanuele Altieri
2002-07-31 5:16 ` Anticipating a Reply
2002-07-31 7:55 ` newbie question on gnu 'as' => explaination about the why (for really newbie ;-)) Frederic Marmond
2002-07-31 10:09 ` Anticipating a Reply
2002-07-31 11:31 ` Frederic Marmond
[not found] <3D47BC4C.2050001@eprocess.fr>
2002-08-01 4:43 ` Anticipating a Reply
[not found] <1028179746.1936.35.camel@italia>
2002-08-01 12:09 ` Anticipating a Reply
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).