Assembly NASM引导加载程序问题
在过去的几天里,我为操作系统做了一些测试,但我不明白为什么这段代码不起作用:我的函数在BX中输入字符串地址,在CX中输入字符串长度。 如果我在CX中输入一个数值,即10,它就工作,如果我在CX中输入[len],它就不工作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
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指令将返回地址推送到堆栈。缺少数据段的定义,缺少堆栈段和堆栈指针的定义。