当我制作操作系统时,如何在FASM中显示字符串。我可以这样做(显示"8“字符):
mov ax, 9ch
mov ss, ax
mov sp, 4096d
mov ax, 7c0h
mov ds, ax
;---- actual code:
mov ah, 0eh
mov al, 38h
int 10h
jmp $
;----
times 510 - ($-$$) db 0
dw 0xAA55 但这不起作用(我看到了黑屏):
mov ax, 9ch
mov ss, ax
mov sp, 4096d
mov ax, 7c0h
mov ds, ax
;----
mov ah, 09h
mov dx, text
text:
db 'Hello$'
int 10h
jmp $
;----
times 510 - ($-$$) db 0
dw 0xAA55请告诉我我做错了什么,我该怎么做?
发布于 2014-10-11 18:04:43
有几个问题:
首先,您的字符串位于代码的中间,所以在执行mov dx, text之后,CPU将尝试将字符串'Hello$'解释为代码,它如下所示:
dec ax
gs insb
outsw
and al, 0cdh
adc bl, ch
inc byte [bx+si]如您所见,原始的int 10h和jmp $指令丢失了。要解决这个问题,只需将text变量移到jmp $语句下面即可。
其次,您似乎混淆了DOS函数和BIOS函数。第二个代码块设置为使用DOS打印字符串(顺便说一下,字符串使用int 21h,而不是 int 10h)。但是,因为您正在编写操作系统,所以没有任何DOS功能可用;您只有BIOS。相反,您需要手动循环字符串中的字符,并打印每个字符,直到其结束为止。一个例子可能是这样的:
mov si, text
mov bx, 0007h ; set page to 0 and color to light gray text on black background
mov ah, 0eh ; select single character print service
printLoop:
lodsb ; grab next character from [si] and increment si
cmp al, '$' ; check for end of string
je printDone ; exit if done
; all parameters are set up - print the character now
int 10h
jmp printLoop ; run the loop again for the next character
printDone:
...发布于 2015-06-16 19:42:39
这可能对你有帮助:
ORG 0x7c00
start:
push cs
pop ds ; ds = None
mov si, welcome
call printl
hlt ;or as you used jmp $
welcome db 'Welcome in os', 0
include 'sysf.asm'
times 510 - ($-$$) db 0
db 0x55
db 0xAA和sysf.asm:
;SI is argument to function - string that you want to print out.
printl:
pusha ;copy normal registers
xor bx,bx ;clear bx
jmp printl001
printl001:
lodsb ;load next bit from si to al
or al,al ;check is al = 0
jz printl002 ;if al = 0 jump to printl002
mov ah, 0x0e ; set ah to 0x0e for 0x10
int 0x10
jmp printl001 ;continue printing (go again)
printl002:
popa ;put old registers back
ret ;go back to place of 'call printl'https://stackoverflow.com/questions/26317419
复制相似问题