-2

这是整个文件,disp_str将在 *.c 文件中使用

我是 github 的新手。

如果我有这个文件的 64 位版本,我可以从中学习。

[SECTION .data]
disp_pos    dd  0

[SECTION .text]

global  disp_str

; ========================================================================
;                  void disp_str(char * info);
; ========================================================================
disp_str:
    push    ebp
    mov ebp, esp

    mov esi, [ebp + 8]  ; pszInfo
    mov edi, [disp_pos]
    mov ah, 0Fh
.1:
    lodsb
    test    al, al
    jz  .2
    cmp al, 0Ah 
    jnz .3
    push    eax
    mov eax, edi
    mov bl, 160
    div bl
    and eax, 0FFh
    inc eax
    mov bl, 160
    mul bl
    mov edi, eax
    pop eax
    jmp .1
.3:
    mov [gs:edi], ax
    add edi, 2
    jmp .1

.2:
    mov [disp_pos], edi

    pop ebp
    ret

因为我的电脑是 64 位的,所以我需要将其转换为 64 位格式。

这个代码是我在一本书中找到的。我猜这段代码是在屏幕上打印一个字符串,对吗?

4

1 回答 1

1

该代码似乎正在将文本写入一个 80 列的 PC 文本模式样式缓冲区,其中每个单元格都由一个包含颜色信息(四位前景、一位闪烁、三位背景)的字节和一个字符字节来描述,将所有内容设置为黑底白字或白底黑字。

但是,它不处理滚动,不处理超过 80 个字符的行,也不更新硬件光标。

它使用gs:段覆盖来写入输出,这表明它可能直接进入视频内存;但我没有看到该代码中设置了该描述符,所以我不知道它应该具有什么值。这可能是您的操作系统或 DOS 扩展器或任何您拥有的任何东西的标准配置。

我认为您不需要将其转换为 64 位,因为您的计算机无论如何都应该支持运行 32 位代码。

但是,如果您出于某种原因确实需要这样做,您可以尝试编译这个我认为大致等效的 C 代码。

extern short *disp_ptr;
void disp_str(char *s)
{
    int c;
    /* fetch the current write position */
    short *p = disp_pos;

    /* read characters from the string passed to the function, and stop
     * when we reach a 0.
     */
    while ((c = *s++) != '\0')
    {
        /* If we see a newline in the string:
         */
        if (c == '\n')
        {
            intptr_t i = (intptr_t)p;

            /* round the address down to a multiple of 160 (80 16-bit
             * values), and add one to advance the write pointer to the
             * start of the next line.
             */
            i /= 160;
            i = (i & 255) + 1;
            i *= 160;
            p = (void *)i;
        }
        else
        {
            /* write the character to the screen along with colour
             * information
             */
            *p++ = c | 0x0f00;
        }
    }

    /* write the modified pointer back out to static storage. */
    disp_pos = p;
}
于 2013-07-04T20:12:48.623 回答