Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 我试图在汇编中使用函数,但它不起作用_Assembly_X86 16_Bootloader_Bios_Osdev - Fatal编程技术网

Assembly 我试图在汇编中使用函数,但它不起作用

Assembly 我试图在汇编中使用函数,但它不起作用,assembly,x86-16,bootloader,bios,osdev,Assembly,X86 16,Bootloader,Bios,Osdev,我正在尝试用汇编语言制作一个基本的操作系统。但这不起作用。我不知道为什么。顺便说一下,我是个初学者。我想做的事情是让print_字符串,使用函数来打印boot_字符串。 代码: 但是当我编译它时,它给出了这个错误 nasm -f bin -o os.bin os.asm os.asm:13: error: symbol `text_string' undefined os.asm:19: error: label `print_string' changed during code genera

我正在尝试用汇编语言制作一个基本的操作系统。但这不起作用。我不知道为什么。顺便说一下,我是个初学者。我想做的事情是让print_字符串,使用函数来打印boot_字符串。 代码:

但是当我编译它时,它给出了这个错误

nasm -f bin -o os.bin os.asm
os.asm:13: error: symbol `text_string' undefined
os.asm:19: error: label `print_string' changed during code generation [- 
w+error=label-redef-late]
os.asm:21: error: label `print_string.repeat' changed during code generation [- 
w+error=label-redef-late]
os.asm:28: error: label `print_string.done' changed during code generation [- 
w+error=label-redef-late]
make: *** [Makefile:2: nasm] Error 1

如果有人能帮我解决这个问题,我会非常高兴。如果您知道任何有关操作系统开发的网站,请提供URL,以便我也可以检查它们^ ^ ^ ^

垃圾表明未从
引导字符串
馈送,即执行
lodsb
时未正确设置DS:SI

CS:IP是开始时仅有的两个具有定义内容的寄存器。使用CS初始化数据段寄存器。或者,您也可以使用
cs:lodsb
而不是
lodsb
,并在引导代码中保留未定义的DS

       BITS 16
start:
    MOV AX,CS
    MOV DS,AX     ; Let the memory model be TINY.
    mov si, boot_string
    call print_string
    jmp $         ; INFINITE LOOP

print_string:
    MOV AH,0Eh    ; BIOS Teletype output
    XOR BX,BX     ; at videopage 0.
.repeat:
    lodsb
    cmp al, 0
    je .done
    int 10h
    jmp .repeat
.done:
    ret

boot_string    db 'Starting Operating System...', 0

    times 510-($-$$) db 0
    dw 0xAA55

代码中没有对
文本字符串的引用。您确定这些消息来自于构建与此处显示的文件相同的版本吗?您发布的代码,使用您使用的nasm命令,对我来说,汇编没有错误。您是否有可能有两个不同版本的文件,或者没有将文件保存在编辑器中?我更改了它,抱歉我太笨了,我复制粘贴了错误的代码好吧,现在您引用的字符串
text\u string
,您从未定义过。当然,这是行不通的。你是想用
boot_string
来代替吗?哦,好吧,我删除了mov-si,text_string,它启动了,但它不打印任何东西。我复制粘贴了这段代码,但现在它什么也不打印。你不能指望CS的值是你期望的值。一些BIOS可能会将CS设置为0x07c0,一些BIOS可能会将其设置为0x0000。将CS复制到其他寄存器不是一个好主意。顶部没有
组织0x7c00
,因此默认为0x0000。0x0000的
组织需要设置0x7c0的CS。0x7c00的组织要求CS为0。@MichaelPetch,你说得对,
Org 7C00h
一开始就不存在了。维基说CS:IP总是0000:0x7C00,这是错误的吗?维基百科有很多关于技术文章的错误信息(我已经改正了一些!)。维基百科说CS总是0x0000,IP总是0x7c00是错误的。事实上,引导加载程序开始的物理地址是物理地址0x07c00。但是,有不止一种方法可以到达该物理地址。0x07c0:0x0000是物理地址0x07c00,0x0000:0x7c00也是物理地址0x07c00。有很多BIOSes实际使用0x07c0:0x0000,其中一部分来自CD-ROM Eltorito规范中的措辞。我已经修改了维基百科。另一方面,在BOCHS中,当使用软盘模拟引导CDROM介质时,BIOS实际上使用0x07c0:0x0000。它在引导非CDROM介质时使用0x0000:0x7c00。
       BITS 16
start:
    MOV AX,CS
    MOV DS,AX     ; Let the memory model be TINY.
    mov si, boot_string
    call print_string
    jmp $         ; INFINITE LOOP

print_string:
    MOV AH,0Eh    ; BIOS Teletype output
    XOR BX,BX     ; at videopage 0.
.repeat:
    lodsb
    cmp al, 0
    je .done
    int 10h
    jmp .repeat
.done:
    ret

boot_string    db 'Starting Operating System...', 0

    times 510-($-$$) db 0
    dw 0xAA55