我正在尝试访问x86 MASM汇编程序中的程序段前缀(PSP)。作为测试,我想在运行程序后打印给定的命令行参数。我尝试将PSP的地址放在dx
寄存器中,偏移量为81h
:命令行参数的位置。
但是,在运行程序后,我得到this作为回报。我可以看到给定的命令行参数,但它之前有很多乱码。知道为什么会这样吗?我猜我在81h没能正确访问PSP?
IDEAL
P386
MODEL FLAT, C
ASSUME cs:_TEXT,ds:FLAT,es:FLAT,fs:FLAT,gs:FLAT
CODESEG
start:
sti ; Set The Interrupt Flag
cld ; Clear The Direction Flag
push ds ; Put value of DS register on the stack
pop es ; And write this value to ES
mov ah, 09h
mov dx, ds:[81h]
int 21h
mov eax, 4c00h ; AH = 4Ch - Exit To DOS
int 21h ; DOS INT 21h
DATASEG
STACK 1000h
END start
答案 0 :(得分:3)
我怀疑它是因为INT 21h子功能9需要' $'终止字符串。
此外,我认为mov dx, ds:[81h]
应为mov dx, 81h
,因为DS已根据中断的要求加载。
考虑类似的事情:
IDEAL
P386
MODEL FLAT, C
ASSUME cs:_TEXT,ds:FLAT,es:FLAT,fs:FLAT,gs:FLAT
CODESEG
start:
sti ; Set The Interrupt Flag
cld ; Clear The Direction Flag
push ds ; Put value of DS register on the stack
pop es ; And write this value to ES
; INT 21h subfunction 9 requires '$' to terminate string
xor bx, bx
mov bl, [80h]
cmp bl, 126
ja exit
mov byte [bx + 81h], '$'
; print the string
mov ah, 09h
mov dx, 81h
int 21h
exit:
mov eax, 4c00h ; AH = 4Ch - Exit To DOS
int 21h ; DOS INT 21h
DATASEG
STACK 1000h
END start
这是中断API的有用资源: