首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FASM操作系统

FASM操作系统
EN

Stack Overflow用户
提问于 2014-10-11 17:42:11
回答 2查看 844关注 0票数 1

当我制作操作系统时,如何在FASM中显示字符串。我可以这样做(显示"8“字符):

代码语言:javascript
复制
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  

但这不起作用(我看到了黑屏):

代码语言:javascript
复制
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

请告诉我我做错了什么,我该怎么做?

EN

回答 2

Stack Overflow用户

发布于 2014-10-11 18:04:43

有几个问题:

首先,您的字符串位于代码的中间,所以在执行mov dx, text之后,CPU将尝试将字符串'Hello$'解释为代码,它如下所示:

代码语言:javascript
复制
dec ax
gs insb
outsw
and al, 0cdh
adc bl, ch
inc byte [bx+si]

如您所见,原始的int 10hjmp $指令丢失了。要解决这个问题,只需将text变量移到jmp $语句下面即可。

其次,您似乎混淆了DOS函数和BIOS函数。第二个代码块设置为使用DOS打印字符串(顺便说一下,字符串使用int 21h而不是 int 10h)。但是,因为您正在编写操作系统,所以没有任何DOS功能可用;您只有BIOS。相反,您需要手动循环字符串中的字符,并打印每个字符,直到其结束为止。一个例子可能是这样的:

代码语言:javascript
复制
    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:
    ...
票数 0
EN

Stack Overflow用户

发布于 2015-06-16 19:42:39

这可能对你有帮助:

代码语言:javascript
复制
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:

代码语言:javascript
复制
;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'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26317419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档