Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.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_Nasm_Boot - Fatal编程技术网

Assembly 汇编语言在引导扇区中使用函数时打印垃圾值

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

您好,我正在尝试使用汇编语言(一个简单的引导扇区程序)中的函数打印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_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
用于开始显示