我是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字符,但是它不起作用。
当我用以下代码行替换“LES”行时,它确实起作用。
mov bx,0b800h
mov es,bx
xor di,di
与BufAddr变量一起使用时,“LES”指令是否不能完成与前三行代码相同的操作?
当我调试编译的exe时(我使用MASM 6.11作为编译器),我注意到ES和DI寄存器未加载正确的值。
最佳答案
在加载段和RAM偏移之前,您需要将DS
寄存器设置为实际指向您的数据段。默认情况下,DS
指向您的PSP,而不是您希望它指向的位置。