预订:IBM PC汇编语言程序设计:Peter Abel第五版
第143页节目:接受和显示名字
movzx
设置BX
,其中包含输入的字符数。在mov,[bx]
中充当索引寄存器以促进扩展寻址。MOV
将BX
中的长度与KBNAME
的地址相结合,并将07H
移动到计算出的地址。对于长度为11的指令,指令在07H
处插入KBNAME+11
(替换Enter字符)。 c10center中的指令mov kbname[bx+1],'$'
在
$
之后插入07H
分隔符,以便int 21h
函数09H
可以显示名称并发出声音1 c10center proc near 2 movzx bx,actulen 3 mov kbname[bx],07 4 mov kbname[bx+1],'$' 5 mov dl,actulen 6 shr dl,1 7 neg dl 8 add dl,40 9 mov dh,12 10 call q20cursor 11 ret 12 c10center endp
我的问题是第3行的,07
是做什么的?
我也很困惑第4行如何运作?定界符?
答案 0 :(得分:1)
第3行:在缓冲区bx
的{{1}}指定的位置放置“铃”字符(实际上是字符7;它被称为响铃,因为计算机在打印时会发出蜂鸣声)。请注意它首先移动(具有零扩展,所以我认为它是某种8位值?)kbname
中的actulen
,因为在16位x86中它是一个或几个寄存器可用于索引寻址模式。
第4行做了类似的事情,但在字符串的下一个位置使用bx
字符。
在C中,这两行只是
$
本书讨论了一个“分隔符”,因为kbname[actulen] = 7;
kbname[actulen+1] = '$';
使用int 21h/ah=09h
作为标记,它必须显示的字符串已经结束。在这方面,在DOS汇编程序中,$ -terminated(“ASCII $”)字符串实际上类似于C的NUL终止(“ASCIIZ”)字符串(实际上,分隔符选择是愚蠢的,因为$是一个确实发生的字符在你想要显示的“普通”字符串中)。