【发布时间】:2017-10-30 14:04:14
【问题描述】:
我阅读了一些关于
的早期帖子
“ptr 做什么?”
“[]做什么?”
但我发现对理解以下问题没有任何帮助?
Title : Program failed to comprehend
.model small
.stack 100h
.data
Msg db 10,13, 'Zahid. $'
.code
.startup
; Initialising data segment
mov ax, @data
mov dx, ax
;Before operation displaying message
mov dx, offset msg
mov ah,09h
int 21h
mov msg , 'A' ; Writing on memory specified by msg thats OK -> A
mov msg+1 , 'R' ; Confusion as writing on memory specified by msg then add 1(not 8bits next address write) -> A
mov [msg]+2, 'I' ; confusion: Writing on memory specified by msg then add 2 value to that address write-> I
mov byte ptr [msg+3] , 'F' ; Ok with me, writing on byte memory specified by msg+3 -> F
mov word ptr [msg + 4], '.' ; Confused again as writing on word memory specified by msg+4, '.' Will it write ascii on the two bytes-> .
mov msg[5] , '$' ; Not confused on this.
;Print var
mov dx, offset msg
mov ah,09h
int 21h
;Exit Code.
mov ah,04ch
xor al,al
int 21h
Ends
Output :
Zahid. ARIF.
请解释一下操作,因为我认为它不应该打印'ARIF'??
【问题讨论】:
-
您希望它打印什么?仅通过查看代码和 cmets 就很清楚,它应该打印类似
'Arif'的内容(虽然我希望它是大写的)。甚至在代码中包含字符ARIF.。 -
输出应该是
\n\rZahid. ARIF.你要么没有发布确切的输出,要么是代码。编辑:实际上,您的 DOS 换行符 13,10 字节的顺序错误,因此输出将开始\n\r,而不是\r\n。你的问题到底是什么? -
为什么 mov [msg] +2 , 'I' 没有产生错误。因为 [msg] 将返回变量的地址,然后将其增加 2 并将该地址初始化为某个值不应在执行时产生 'i'
-
emu8086 和 MASM(以及 MASM 仿真模式下的 TASM)语法相当宽松,所有这些在 MASM 中都是等价的:
mov msg+2,'I'、mov [msg+2],'I'、mov [msg]+2,'I'、mov byte ptr [msg+2],'I'、@987654334 @,mov msg[2],'I'(不确定这个,我没有emu8086来验证)......基本上只要一侧是内存操作数,它就是内存操作数。查看 Intel 指令参考指南以查看有效的内存操作数,尤其是在 16 位实模式下,它们非常有限。 (不需要byte ptr,因为msg是由db定义的,MASM 承认这一点) -
相关:stackoverflow.com/questions/25129743/…。 “方括号
[]在您仅使用符号时对 MASM 几乎没有任何意义。它们仅在您将它们与寄存器一起使用时才有意义。” (MASM / TASM / emu8086 在这方面都一样,AFAIK)。