代码之家  ›  专栏  ›  技术社区  ›  Harvey

在装配中使用LODSB需要什么?

  •  4
  • Harvey  · 技术社区  · 16 年前

    为什么?

    回答:

    工作技术(两者):

    • cld
    • 设置 ds cs
    • si
    • 将起始偏移添加到

    非工作技术(仅适用于pxelinux):

    • 根据计算新的段地址 (((cs << 4) + offset) >> 4)
    • 设置 ds公司 对那件事(A000或07C0)

    text here to fix bug in markdown

    // Note: If you try this code, don't forget to set 
    //       the "#if 0" below appropriately!
    
        .text
        .globl  start, _start
    
    start:  
    _start: 
    _start1:    
    
        .code16
    
        jmp real_start
    
        . = _start1 + 0x1fe
        .byte 0x55, 0xAA
    
        // Next sector
        . = _start1 + 0x200
    
        jmp real_start
    
    test1_str:
        .asciz  "\r\nTest: 9020:fe00"
    test2_str:
        .asciz  "\r\nTest: a000:0000"
    
    real_start:
    
        cld         // Make sure %si gets incremented.
    
    #if 0
        // When loaded by pxelinux, we're here:
        // 9020:fe00 ==> a000:0000
    
        // This works.
        movw    $0x9020, %bx
        movw    %bx, %ds
        movw    $(test1_str - _start1), %si
        addw    $0xfe00, %si
        call    print_message
    
        // This does not.
        movw    $0xA000, %bx
        movw    %bx, %ds
        movw    $(test2_str - _start1), %si
        call    print_message
    #else
        // If we are loaded directly without pxelinux, we're here:
        // 0000:7c00 ==> 07c0:0000
    
        // This works.
        movw    $0x0000, %bx
        movw    %bx, %ds
        movw    $(test1_str - _start1), %si
        addw    $0x7c00, %si
        call    print_message
    
        // This does, too.
        movw    $0x07c0, %bx
        movw    %bx, %ds
        movw    $(test2_str - _start1), %si
        call    print_message
    #endif
    
        // Hang the computer
        sti
    1:
        jmp 1b
    
    
    // Prints string DS:SI (modifies AX BX SI)
    print_message:
        pushw   %ax
        jmp 2f
    3:
        movb    $0x0e, %ah  /* print char in AL */
        int $0x10       /* via TTY mode */
    2:  
        lodsb   (%si), %al  /* get token */
        cmpb    $0, %al     /* end of string? */
        jne 3b
        popw    %ax
        ret
    
    .balign 0x200
    

    /usr/bin/ccache gcc -Os -fno-stack-protector -fno-builtin -nostdinc  -DSUPPORT_SERIAL=1 -DSUPPORT_HERCULES=1 -DSUPPORT_GRAPHICS=1 -DHAVE_CONFIG_H -I. -Wall -ggdb3 -Wmissing-prototypes -Wunused -Wshadow -Wpointer-arith -falign-jumps=1 -falign-loops=1 -falign-functions=1 -Wundef -g -c -o ds_teststart_exec-ds_teststart.o ds_test.S
    /usr/bin/ccache gcc  -g   -o ds_teststart.exec -nostdlib -Wl,-N -Wl,-Ttext -Wl,8000 ds_teststart_exec-ds_teststart.o  
    objcopy -O binary ds_teststart.exec ds_teststart
    
    2 回复  |  直到 9 年前
        1
  •  4
  •   Harvey    16 年前

    第一个问题:

    9020:FE00==>9000:0000而不是A000:0000

    shrw   $4, %bx
    

    应该是的

    sarw   $4, %bx   // Preserves sign!!
    

    90200+FE00=90200-200=90000

    问题答案:

    为了使用LODSB,您必须:

    • 设置 ds
    • 使用正确设置方向标志 cld std
    • 设置 si 到源缓冲区的偏移量。
    • 读取的有效地址为 (ds << 4) + si
        2
  •  0
  •   user298321    16 年前

    推送cs

    推荐文章