问题2:DS是默认的段地址寄存器,尽管前面有一个ASSUME指定了DS指向DATA段,但汇编语句需要自行初始化,即将DATA地址赋给DS,但DS只能和AX等寄存器进行互操作,因此需要先将DATA赋给AX。代码中前面的伪代码DATA SEGMENT/ENDS声明使得DATA自动作为段地址变量;后面的实际代码中需要该代码支撑的语句比较多,但比较直接的是MOV DL,[BX]。它会用到DS段地址,等效于MOV DL,DS:[BX],类似的语句可以替换DS为ES或CS。
问题3:代码中用到DOS调用的10号功能,它从键盘读入字符串到缓冲区(DX为地址指针),缓冲器的第一个字符表示最大输入字符数,第二个字符为DOS调用返回参数表示实际输入的字符数:
DS:DX=缓冲区首地址
(DS:DX)=缓冲区最大字符数
(DS:DX+1)=实际输入的字符数
该语句就是将BUFFER+1填入CX,CL=1,CH=0,实际上是读入了实际输入字符数,用于后续的字符处理循环计数,即LOOP指令。
问题3中的下一句MOV CH,0用于强制对CH清零,原因如前所述,需要自行初始化。另一个替代方案是MOV CX, BUFFER+1,这样会自动对CH清零,而且适用于当BUFFER位置比较靠后,比如大于255时。
程序中LEABX LEADX都是将偏移地址填入对应寄存器,前面将AX置零后进入循环ONE处的乘法使得第一次乘法没有作用,然后将BX指向的字符装入DL并屏蔽高4位,因为输入的数字的十六进制分别位30H,...,39H,所以意味着得到了对应的数值,等效方法是将DL减48,即减30H。
INC BX是调整指针。
因此,问题1可以自行回答了吧?!
1:说明程序的功能
--把输入的数字字符串(即数字的ASCII码),变成对应的二进制数。
--存入 X 单元。
2:第8行和第9行的两句:
MOV AX,DATA
MOV DS,AX
的作用是什么,程序中哪些行的代码与这两句有关
--把数据段的段地址,送到DS。
--下列指令,都和数据段有关:
LEA DX,BUFFER
MOV CL,BUFFER+1
LEA BX,BUFFER+2
DNE: MUL C10
MOV DL,[BX]
3:第14行 MOV CL,BUFFER+1;这句执行后,CL中得到的是什么内容,作用是什么。
--得到了输入字符串的字节数。
--用来控制,处理字符的循环次数。
第15行MOV CH,0;这一句的作用是什么,为什么需要。
--把 CX 高八位清零。
--因为,CX 将用于控制循环次数。