回 帖 发 新 帖 刷新版面

主题:程序有段不是很理解

按五位十进制的形式显示寄存器BX中的内容,如果BX的值小于0,则应在显示数值之前显示负号'-'。

例如:(BX)=123,显示:00123;(BX)=-234,显示:-00234;

解: 
 ;子程序功能:把寄存器BX的内容按十进制有符号数显示出来 
;入口参数:BX 
;出口参数:无,只有显示信息 
;算法描述: 1、定义6个字节的存储单元
2、先判断BX是否小于零,如果是,则先显示负号'-',再取BX的绝对值;
3、采用除10,得余数的方法,从低位向高位求出每位十进制位;
4、输出数据的字符串。 
SubData SEGMENT 
DB
  5 DUP('0'), 0ah, 0dh, '$'    ;0ah、0dh:换行、回车 
SubData ENDS 
DISPBX PROC 
      ASSUME DS:SubData 
      PUSH DS 
      PUSH DX 
      PUSH CX 
      PUSH AX 
      MOV AX, SubData ;取子程序所用的数据区段地址 
      MOV DS, AX 
      CMP BX, 0 
      JGE next 
      MOV DL, '-' 
      MOV AH, 2 
      INT 21H ;显示负号'-' 
      NEG BX ;求-BX,使其值为正数 
      next: MOV SI, 4 [color=FF0000];对于next是真的很不理解,请详细解释这三个句子[/color]      
            MOV AX, BX 
            MOV CX, 10D 
      again: XOR DX, DX    
             IDIV CX ;DX存放余数,AX存放商 
             ADD DL, '0'  ;[color=FF0000]这句往下到jge的三个句子是什么意思[/color]
             MOV [SI], DL 
             DEC SI 
             JGE again 
      XOR DX, DX 
      MOV AH, 9 
      INT 21H 
      POP AX 
      POP CX 
      POP DX 
      POP DS 
      RET 
DISPBX ENDP 

回复列表 (共3个回复)

沙发

next: MOV SI, 4 ;SI指向五位十进制数的个位(缓冲区)
      MOV AX, BX ;BX作为被除数
      MOV CX, 10D ;CX为除数(余数为个位)
again: XOR DX, DX    
       IDIV CX ;DX存放余数,AX存放商 
       ADD DL, '0'  ;将个位数转换为ASCII
       MOV [SI], DL ;然后放入缓冲区的相应位置(个位)
       DEC SI       ;指向上一位
       JGE again    

通过把BX辗转除10,余数依次为个十百千万,再依次存入缓冲区

板凳

MOV SI, 4 ;SI指向五位十进制数的个位(缓冲区)
MOV [SI], DL ;然后放入缓冲区的相应位置(个位)
这两句不是很理解,请楼上的老兄再解释一下。
SI好像起了个计数器的作用,怎么直接MOV [SI], DL
SI指向哪?

3 楼

[quote]MOV SI, 4 ;SI指向五位十进制数的个位(缓冲区)
MOV [SI], DL ;然后放入缓冲区的相应位置(个位)
这两句不是很理解,请楼上的老兄再解释一下。
SI好像起了个计数器的作用,怎么直接MOV [SI], DL
SI指向哪?[/quote]

SI在这是指针,不是计数器。BUF[0]指向万位,BUF[4]指向个位,
所以SI=4时,DS:SI指向BUF[4],也就是个位

我来回复

您尚未登录,请登录后再回复。点此登录或注册