Asm help

Question about which tools to use, bugs, the best way to implement a function, etc should go here. Don't forget to see if your question is answered in the wiki first! When in doubt post here.
Post Reply
Silenger

Asm help

Post by Silenger »

Sorry if i wrote stupid code :)
I am just learning asm and i want to write a 'a' at a line i choose in PMode

pop ax ;Pop line
shl ax, 41 ;Line * 80 * 40
xor di, di ;Zero
mov di, ax ;Set line
mov ax, 0B8000h ;Screen mem !To big
mov si, ax ;Set screen
mov ah, 'a' ;Put a in ax
mov si:[di], ah ;Write char in mem !wrong
inc di ;Next byte
mov ah, 0x07 ;Set attr
mov si:[di], ah ;Write attr in mem !wrong

I can't find what i am doing wrong....

If you know some realy good tut plz post them thx
drizzt

Re:Asm help

Post by drizzt »

If you are in PMode try with this code... I hope I've been more clear as possible:

Code: Select all

; These are memory locations:
x_pos   dw   0
y_pos   dw   0

; Remember video_location = (y_pos*80 + x_pos) + 0xB8000
print_A_on_the_screen:

mov   ax, [y_pos]   ; ax = y_pos
mov   cx, 80
mul   cx      ; ax = y_pos*80
add   ax, [x_pos]   ; ax = y_pos*80 + x
shl   ax, 1      ; ax = ax * 2 (every location is 1 word = 2 bytes)

mov   bl, 'A'
mov   bh, 0x07    ; <attribute/color>

mov   [eax+0xB8000], bx   ; Write a grey A on the screen
Otherwise you can read this tutorial on Bona Fide OS site:
http://osdev.neopages.net/tutorials/basickernel.php

It explain how to write simple printf function in PMode without BIOS ints (asm & C)
Silenger

Re:Asm help

Post by Silenger »

I wrote this based on yours:
I used bootf02 boot loader from John Fine
But it do nothing it just restarts the comp

You used eax but the value is in ax?
I don't get it, is the value in ax also in eax?

mov [eax+0xB8000], bx ???

Code: Select all

ORG 0xFF800000

BITS 32

SEGMENT .data

SEGMENT .text
START:

PUSH 1
PUSH 1
MOV AL, 'A'
MOV AH, 0x07
PUSH AX
CALL WriteChar

JMP $


;Write char
;Use:
;   PUSH X-Pos
;   PUSH Y-Pos
;   PUSH Attribute/Color + Char
;        High byte         Low byte

WriteChar:
POP BX ;Attribute/Color + Char
POP CX ;Y-Pos
POP AX ;X-Pos

SHL CX, 40 ;Y-Pos * 80
ADD AX, CX ;X-Pos + (Y-Pos * 80)
SHL AX, 1  ;AX * 2

MOV [EAX+0xB8000], BX ;Write char

RET
;End Write char
Slasher

Re:Asm help

Post by Slasher »

NO!!!
the upper part of EAX could have any value in it!
to ensure that EAX has the same value as AX
clear EAX
mov eax,0
before you assign a value to AX
mov ax,XXXX
now EAX will have same value as AX because
the top part has been filled with ZERO
top EAX bottom EAX
AX
00000000XXXXXXXX
Silenger

Re:Asm help

Post by Silenger »

Ow k thx

What is the fastest MOV EAX, 0 or XOR EAX, EAX?

So:

;Write char
;Use:
; PUSH X-Pos
; PUSH Y-Pos
; PUSH Attribute/Color + Char
; High byte Low byte

WriteChar:
XOR EAX, EAX ;Clear

POP BX ;Attribute/Color + Char
POP CX ;Y-Pos
POP AX ;X-Pos

SHL CX, 40 ;Y-Pos * 80
ADD AX, CX ;X-Pos + (Y-Pos * 80)
SHL AX, 1 ;AX * 2

MOV [EAX+0xB8000], BX ;Write char

RET
;End Write char
Slasher

Re:Asm help

Post by Slasher »

check out intel's instruction set docs
contain timing info for each instruction
richie

Re:Asm help

Post by richie »

xor eax,eax is faster than mov eax,0 because with xor eax,eax the computer has only to tranfer the operation-code over the system-bus. With mov eax,0 ist first transfers the opcode of mov eax,? and then it transfers the parameter of this operation (in this case it is 0). Another advantage of xor eax,eax is that it is 1 Byte smaller than mov eax,0. (I hope that's right). So your kernel will be one byte bigger if you use mov eax,0, but nowadays this shouldn't matter.
User avatar
df
Member
Member
Posts: 1076
Joined: Fri Oct 22, 2004 11:00 pm
Contact:

Re:Asm help

Post by df »

personally i've long since given up counting cycles.
i'd rather have

- something that works, over something that doesnt
- a good slow algo instead fast code
etc
-- Stu --
Berserk

Re:Asm help

Post by Berserk »

Why? In things like the BootSector, one byte means alot, so if you could save a byte, why not?

Also, as for speed, i'm not saying that you should spend hours speed optimizing the code, but if you can add a few tweaks that'll save some load time, then why not?
Silenger

Re:Asm help

Post by Silenger »

Thx you all.

So if you mul or div by 2 or 4,6,...
you best use SHL REG, 1 or RHL REG, 1 because its faster and it as easy as writing mul?
drizzt

Re:Asm help

Post by drizzt »

Watch out! if you have to mul by 2, 4, 8, 16... (powers of 2) you can use SHL instruction... you can't use it to multiply by 6...
Curufir

Re:Asm help

Post by Curufir »

You can perform any multiplication in asm using multiple combitions of SHL and ADD. It's just a question of when the SHL/ADD technique takes up more cycles than the MUL. This varies from processor to processor, MUL is definitely getting to be faster than it used to be. Division of course is an entirely different proposition, if you aren't dividing by 2^X then techniques start to get quite complicated and it's usually better handled by the hardware.

BTW, if you're working in asm it's far handier to be able to do hex maths in your head than decimal or binary.
Post Reply