它是如何工作的?我的程序中的分隔符和扩展寻址

时间:2016-06-09 04:46:23

标签: assembly tasm

预订:IBM PC汇编语言程序设计:Peter Abel第五版

第143页节目:接受和显示名字

  

movzx设置BX,其中包含输入的字符数。在mov,[bx]中充当索引寄存器以促进扩展寻址。 MOVBX中的长度与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行如何运作?定界符?

1 个答案:

答案 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”)字符串(实际上,分隔符选择是愚蠢的,因为$是一个确实发生的字符在你想要显示的“普通”字符串中)。