Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.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 NASM引导加载程序问题_Assembly_Nasm_Bootloader - Fatal编程技术网

Assembly NASM引导加载程序问题

Assembly NASM引导加载程序问题,assembly,nasm,bootloader,Assembly,Nasm,Bootloader,在过去的几天里,我为操作系统做了一些测试,但我不明白为什么这段代码不起作用:我的函数在BX中输入字符串地址,在CX中输入字符串长度。 如果我在CX中输入一个数值,即10,它就工作,如果我在CX中输入[len],它就不工作 bits 16 org 0x7c00 mov bx, string mov cx, [len] call print jmp $ ; bx = string address, cx = string lenght print: xor si, si ._loop

在过去的几天里,我为操作系统做了一些测试,但我不明白为什么这段代码不起作用:我的函数在BX中输入字符串地址,在CX中输入字符串长度。 如果我在CX中输入一个数值,即10,它就工作,如果我在CX中输入[len],它就不工作

bits 16
org 0x7c00


mov bx, string
mov cx, [len]
call print

jmp $

; bx = string address, cx = string lenght
print:
    xor si, si
._loop:
    mov al, [bx+si]
    mov ah, 0x0e
    int 0x10
    inc si
    cmp si, cx
    jl ._loop

    ret

string db "Hello world!"
len equ $-string

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

您应该测试此代码:

mov si,mystr1
call print_string
print_string:
pusha
@repeat:
lodsb
cmp al,0x00
je @done
mov ah,0x0E
int 10h
jmp @repeat
@done:
popa
ret
mystr1 db 'Hello World!',0

难道[len]在len的地址处不表示-value吗?确实如此。由于len是一个立即数的eq,而不是一个地址,OP应该使用mov-cx,lenYea我刚刚意识到len不是一个内存位置,而是一个常量mov指令使用数据段,call指令将返回地址推送到堆栈。缺少数据段的定义,缺少堆栈段和堆栈指针的定义。