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 通过bios中断获取要打印的字符串_Assembly_X86_Nasm_Interrupt_Bios - Fatal编程技术网

Assembly 通过bios中断获取要打印的字符串

Assembly 通过bios中断获取要打印的字符串,assembly,x86,nasm,interrupt,bios,Assembly,X86,Nasm,Interrupt,Bios,我正在学习汇编,当然,我正在试验经典的0x10BIOS中断。我看过的参考资料展示了如何使用lodsb打印字符串,以便理解操作码,我试图模仿它的行为。这适用于lodsb,但不适用于我所拥有的。我做错了什么 start: mov ah, 0Eh ;for bios interrupt mov si, text_string ;set source index to begining of text_string .repeat: ;I'm trying to emulate

我正在学习汇编,当然,我正在试验经典的0x10BIOS中断。我看过的参考资料展示了如何使用
lodsb
打印字符串,以便理解操作码,我试图模仿它的行为。这适用于
lodsb
,但不适用于我所拥有的。我做错了什么

start: mov ah, 0Eh ;for bios interrupt mov si, text_string ;set source index to begining of text_string .repeat: ;I'm trying to emulate the behavior of lodsb to learn how it works: mov al, [si] ;put character at si in al register add si, 1 ;increment source index cmp al, 0 ;if the character is a zero (end of the string) je done ;end execution int 10h ;bios interrupt to put character on screen jmp .repeat text_string db 'Hello, World!', 0 done: ret 开始: mov啊,0Eh,;用于bios中断 mov si,文本_字符串;将源索引设置为文本字符串的开头 .重复: ;我试图模仿lodsb的行为,以了解其工作原理: mov-al[si];将字符置于al寄存器中的si处 加si,1;增量源索引 cmp-al,0;如果字符为零(字符串末尾) 我做到了;结束执行 int 10h;bios中断以在屏幕上显示字符 jmp,重复 text_string db“你好,世界!”,0 完成: ret
通常情况下,这样做不是一个好主意:

  • 假设所有寄存器都在中断调用(或任何调用,实际上)中保留;或
  • 未为给定呼叫设置所有必需的寄存器
  • 在第一个音符中,我将
    ah
    设置为
    0eh
    ,紧跟在
    int10
    之前

    Int 10h/0eh
    要求将
    bh
    bl
    分别设置为页码和前景色。我还会在
    int10
    之前立即这样做,以确保为调用正确设置它们


    另一方面,您需要确保
    ds
    段寄存器正确,如下所示:

    push cs
    pop ds
    
    因为它看起来像是将字符串放入代码段中。然而,由于
    lodsb
    版本显然有效,我想您已经涵盖了这一点


    而且,从(公认已褪色的)内存中,8086有一条
    inc si
    指令,它可能会节省少量空间,这并不重要,但我是在每个字节都计数的时候伪造的:-)

    首先lodsb是一个命令,它告诉计算机在代码中获取字符并增加偏移量。偏移量由[SI]确定,这是一个易于设置的寄存器。设置SI后,lodsb获取字符并将其放入al。从这一点开始,读取al并确定要执行的操作。还有一个问题是这样的