[x86 real mode <BIOS interrupts>, GAS ASM, linker LD, emulátor BOCHS]
Nazdar,
čelím tentokrát již poměrně konkrétnímu problému... Napsal sem rutinu na načítání čísel, ale jaksi nefunguje. Když zadám 100, vrátí mi 110. Když zadám 200 nebo 250 vždy mi vrátí 210 a tak dále (u tisíce mám overflow v pomocném registru takže se nadají zadávat čísla větší jak 1000). Už sem s tím peru celkem dost hodin, a ne a ne najít kde je zakopanej pes. Pokud by se někomu povedlo najít chybu, byl bych zkutečně rád...
.globl __readNumber
__readNumber:
readChar
cmp al , 'x' /* ještě sem nevyřešil enter, takže pro ukončení zadávání používám x (enter mi dělá bordel...) */
jne rn0
mov ax , 0
mov bl , 0
jmp rn10
rn0:
sub al , 0x30
push ax
call __readNumber
mov cx , ax
power 10 , bl
inc bl
mov dx , ax
pop ax
mul dl /* zde se projeví overflow u čtyř ciferného čísla ... */
add ax , cx
rn10:
ret
Rutiny na kterých je závislá funkce s chybou (načtení znaku) :
.macro readChar
mov ah , 0
int 0x16
printChar al
.endm
.macro printChar char
push ax
setCharColor 0xf
mov al , \char
mov ah , 0xe
int 0x10
pop ax
.endm
.macro setCharColor color
push ax
push bx
push cx
mov bl , \color
call __setCharColor
pop cx
pop bx
pop ax
.endm
.globl __setCharColor
__setCharColor:
mov ah , 0x9
mov al , ' '
mov bh , 0
mov cx , 1
int 0x10
ret