Assembly 汇编语言在引导扇区中使用函数时打印垃圾值
您好,我正在尝试使用汇编语言(一个简单的引导扇区程序)中的函数打印2条消息,这是我的代码:Assembly 汇编语言在引导扇区中使用函数时打印垃圾值,assembly,nasm,boot,Assembly,Nasm,Boot,您好,我正在尝试使用汇编语言(一个简单的引导扇区程序)中的函数打印2条消息,这是我的代码: [org 0x7c00] mov bx,HELLO_MSG call printer mov bx,GOODBYE_MSG call printer jmp $ printer: pusha mov ah,0x0e mov al,bl int 0x10 popa ret HELLO_MS
[org 0x7c00]
mov bx,HELLO_MSG
call printer
mov bx,GOODBYE_MSG
call printer
jmp $
printer:
pusha
mov ah,0x0e
mov al,bl
int 0x10
popa
ret
HELLO_MSG:
db 'Hello, World',0
GOODBYE_MSG:
db 'Bye User',0
times 510-($-$$) db 0
dw 0xaa55
我不知道哪里出了问题,但上面的程序正在打印一些垃圾值。有人能帮我解决这个问题吗?首先,
AL
需要打印一个字符,但你给它一个低字节的指针,指向存储文本第一个字节的内存地址
其次,函数0x0e只在AL
中打印一个字符,因此要打印整个字符串,您应该遍历它
第三,BX
不是存储字符串指针的最佳寄存器。最好使用SI
有了这些
pusha
mov ah, 0x0e
__continue:
mov al, [si]
inc si
test al, al ; terminating null reached?
jz __ret ; yes, exit
int 0x10
jmp __continue
__ret:
popa
ret
mov al,[si]/inc si
可以更改为lodsb
对于较小的代码大小首先,al
需要打印一个字符,但您给它一个低字节的指针,指向存储文本第一字节的内存地址
其次,函数0x0e只在AL
中打印一个字符,因此要打印整个字符串,您应该遍历它
第三,BX
不是存储字符串指针的最佳寄存器。最好使用SI
有了这些
pusha
mov ah, 0x0e
__continue:
mov al, [si]
inc si
test al, al ; terminating null reached?
jz __ret ; yes, exit
int 0x10
jmp __continue
__ret:
popa
ret
mov al,[si]/inc si
可以更改为lodsb
以减小代码大小尝试在引用值之前设置段寄存器。尝试在引用值之前设置段寄存器。谢谢,si代表什么?si只是另一个通用寄存器(源索引寄存器). 它与DI(目标索引)一起用于在某些指令中寻址源操作数和目标操作数,如LODSB
。你绝对应该在理论上花点时间;)你知道什么好书或资料吗??这将是真正的帮助是必须有参考说明。不能给初学者提供任何书籍的建议。抱歉。另外,拉尔夫·布朗的中断列表在真实模式下对您也有帮助int16h
用于键盘,int13h
用于磁盘,int10h
用于显示,以感谢和si代表什么??si只是另一个通用寄存器(源索引寄存器)。它与DI(目标索引)一起用于在某些指令中寻址源操作数和目标操作数,如LODSB
。你绝对应该在理论上花点时间;)你知道什么好书或资料吗??这将是真正的帮助是必须有参考说明。不能给初学者提供任何书籍的建议。抱歉。另外,拉尔夫·布朗的中断列表在真实模式下对您也有帮助int16h
用于键盘,int13h
用于磁盘,int10h
用于开始显示