'LES' 8086 指令未按预期工作

The 'LES' 8086 instruction is not working as intended

我是 8086 汇编的初学者。我正在从旧货店找到的一本 90 年代初期的旧书中学习。我认为像 1992 年那样编程可能会很有趣。

无论如何,我已经完成了这本书,现在我已经在我的旧 Win95 笔记本电脑上的命令提示符下编写了一些程序。

在切换到使用 'les' 指令后,我遇到了这个无法按预期工作的问题。然而,当我用适当的地址手动设置 ES 和 DI 寄存器时它确实起作用了。

;************************************
;   STACK SEGMENT
;************************************

TheStack SEGMENT STACK      ;STACK specifies the stack segment

    db 64 dup (THESTACK)    ;reserves 512 bytes for the stack

TheStack ENDS

;************************************
;   END STACK SEGMENT
;************************************

;************************************
;   DATA SEGMENT
;************************************

Data SEGMENT

BufAddr DD 0b8000000h

Data ENDS

;************************************
;   END DATA SEGMENT
;************************************

;************************************
;   CODE SEGMENT
;************************************

Code SEGMENT

assume CS:Code,DS:Data

MAIN PROC

Start: ;execution begins

    ;setup input for stosw
    les di, DWORD PTR BufAddr
    mov cx,0f4fh  ;cx contains the number of times stosw will loop
    cld

    ;draw smileys
    mov ax,0f01h ;0f is the text attribute for white on black, 01 is the hex code for a smiley
    rep stosw ;write it all to the buffer

   ;EXIT
    mov AH,4CH ;Setup the terminate dos process service 
    mov AL,0 ;ERRORLEVEL takes 0
    int 21H  ;return to dos

MAIN ENDP 

Code ENDS 

;************************************
;   END CODE SEGMENT
;************************************

END Start ;Start is the Main procedure

好的,所以这个程序应该在命令提示符中绘制一堆笑脸 ascii 字符 window,但它不起作用。

当我用以下代码行替换 'LES' 行时,它确实有效。

mov bx,0b800h
mov es,bx
xor di,di

'LES' 指令与 BufAddr 变量一起使用时是否完成与前三行代码相同的事情?

当我调试编译后的 exe(我使用 MASM 6.11 作为编译器)时,我注意到 ES 和 DI 寄存器没有加载正确的值。

在从 RAM 加载段和偏移量之前,您需要将 DS 寄存器设置为实际指向您的数据段。默认情况下,DS 指向您的 PSP,这不是您希望它指向的位置。