'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,这不是您希望它指向的位置。
我是 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,这不是您希望它指向的位置。