鱼C论坛

 找回密码
 立即注册
查看: 2438|回复: 2

[已解决]程序设计一,字符写入问题,求大神告知下

[复制链接]
发表于 2017-1-10 04:29:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
问题: 程序设计一,为何在指定长度写入的数据还会导致文字错乱? 代码如下:
  1. assume cs:codesg ,ss:data,ds:table

  2. data segment   
  3.    db '1975','1976','1977','1978','1979','1980','1981','1982','1983'   
  4.    db '1984','1985','1986','1987','1988','1989','1990','1991','1992'   
  5.    db '1993','1994','1995'
  6.    ;数组格式存放
  7.    dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514   
  8.    dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000     
  9.    ;数组格式存放        
  10.    dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226   
  11.    dw 11452,14430,15257,17800  
  12.    ;数组格式存放  
  13. data ends

  14. table segment
  15.   db 42 dup (0)
  16. table ends


  17. codesg segment       
  18. start:        mov bx,0
  19.                 mov di,0
  20.                 mov dx,0
  21.                 mov cx,15h
  22.                 mov ax,table
  23.                 mov ds,ax
  24.                 mov ax,data
  25.                 mov ss,ax
  26. s:                mov si,0
  27.                 mov ax,word ptr ss:[bx]               
  28.                 mov word ptr ds:[si],ax
  29.                
  30.                 mov ax,word ptr ss:[bx].2
  31.                 mov word ptr ds:[si].2,ax ;年份装入ds:si中
  32.                 add si,6
  33.                
  34.                 push dx
  35.                 mov ax, word ptr ss:[bx].54h
  36.                 push ax
  37.                 mov ax, word ptr ss:[bx].56h
  38.                 push ax
  39.                 mov ax,0ah
  40.                 push ax
  41.                 call dtoc ;收入转入ds:si
  42.                 add si,6
  43.                
  44.                 mov ax,word ptr ss:[di].0a8h
  45.                 push ax
  46.                 mov ax,0
  47.                 push ax
  48.                 mov ax, 0ah
  49.                 push ax
  50.                 call dtoc ;人员转入ds:si中
  51.                 add si,6
  52.                
  53.                
  54.                 push cx
  55.                 mov ax, word ptr ss:[bx].54h
  56.                 push ax
  57.                 mov ax, word ptr ss: [bx].56h
  58.                 push ax
  59.                 mov ax,word ptr ss:[di].0a8h
  60.                 push ax
  61.                 call divdw  ;平均收入转入ds:si中
  62.                 pop cx
  63.                 push ax
  64.                 push dx
  65.                 mov ax,0ah
  66.                 push ax
  67.                 call dtoc
  68.                 add si,6
  69.                
  70.                
  71.                 mov si,0
  72.                 mov ax,24h
  73.                 push ax
  74.                 call dtoc1 ;将ds:si中的字符串0转为空格
  75.                
  76.                 pop dx
  77.                 mov ax,ds
  78.                 push ax
  79.                 mov ax,02
  80.                 push ax
  81.                 push dx
  82.                 mov ax,0
  83.                 push ax
  84.                 call show1; 将数值显示在屏幕上               
  85.                
  86.                
  87.                 inc dx
  88.                 add di,2
  89.                 add bx,4
  90.                
  91.                 loop s
  92.                
  93.                        
  94.                 mov ax,4c00h
  95.                 int 21h       
  96.                

  97. ;功能名: dtoc1
  98. ;说明: 将指定长度ds:si中的字符串0转为空格
  99. ;参数: ax=长度,ds:si指向字符串首地址
  100. ;结果: (ds:si)指向字符串的首地址,字符串以0结尾               
  101. ;源码始
  102. dtoc1:        mov bp,sp
  103.                 push cx
  104.                 mov cx,[bp+2]
  105. e:                push cx
  106.                 mov cl,ds:[si]
  107.                 jcxz b
  108. c:                inc si
  109.                 pop cx
  110.                 loop e
  111.                 mov al,0
  112.                 mov ds:[si],al
  113.                 pop cx
  114.                 ret 2
  115.                
  116. b:                mov al,20h
  117.                 mov ds:[si],al
  118.                 jmp short c
  119. ;源码终
  120. ;功能名: dtoc
  121. ;说明: 将word型数据转变为表示十进制数的字串符,字符串以0结尾,最大转换15byte字符
  122. ;参数: ax=dword型数据低16位
  123. ;参数: dx=dword型数据高16位
  124. ;参数: bx=word型数据,如果除数为0表示求(dx)(ax)/0ah十进制数的字串符,非0表示进行divdw转变为十进制数的字串符
  125. ;结果: (ds:si)指向字符串的首地址
  126. ;源码始
  127. dtoc:        push dx
  128.                 push di
  129.                 push cx               
  130.                 mov bp,sp
  131.                 mov di,0
  132.                 mov ax,[bp+0ch] ;(ax)
  133.                 mov dx,[bp+0ah] ;(dx)
  134. dtocs:        mov cx,[bp+8] ;型数据,如果除数为0表示求(dx)(ax)/0ah十进制数的字串符,非0表示进行divdw转变为十进制数的字串符
  135.                 jcxz dtocz
  136.                 push ax     ;非0表示进行divdw转变为十进制数的字串符
  137.                 push dx
  138.                 push cx
  139. dtocc:        call divdw
  140.                 jmp short dtoce
  141. dtocz:        push ax
  142.                 push dx
  143.                 mov cx,0ah
  144.                 push cx
  145.                 jmp short dtocc
  146. dtoce:        add cl,30h
  147.                 mov ch,0               
  148.                 push cx
  149.                 inc di
  150.                 mov cx,dx
  151.                 jcxz dtocr  ;如果 余数为0  
  152. dtocr:        mov cx,ax
  153.                 jcxz dout
  154.                 jmp short dtocs ;如果商不为零继续除
  155.                
  156. dout:         mov cx,di
  157. dtoct:        pop ax
  158.                 mov byte ptr ds:[si],al ;写入[ds:si]中
  159.                 inc si
  160.                 loop dtoct
  161.                 pop cx       
  162.                 pop di
  163.                 pop dx
  164.                 ret 6
  165. ;源码终
  166. ;功能名: divdw
  167. ;说明: 进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型
  168. ;参数: push ax=dword型数据低16位
  169. ;参数: push dx=dword型数据高16位
  170. ;返回: dx=结果的高16位,ax=结果的低16位 cx=余数
  171. ;源码始
  172. divdw:  
  173.                 push si
  174.                 mov bp,sp
  175.                 mov ax,[bp+6] ;高16位数据
  176.                 mov dx,0
  177.                 mov cx,[bp+4]
  178.                 div cx      
  179.                 mov si,ax
  180.                 mov ax,[bp+8]
  181.                 div cx       
  182.                 mov cx,dx
  183.                 mov dx,si
  184.                 pop si
  185.                
  186.                 ret        6                       
  187. ;源码终

  188. ;功能名: show1
  189. ;说明: 向屏幕显示文本,以零结尾文本
  190. ;参数: push ax 文本,以零结尾
  191. ;参数: push ax 文本颜色,
  192. ;参数: push ax 行,从零开始 范围(0-24)
  193. ;参数: push ax 列,从零开始 范围(0-80),偶数递增
  194. ;结果: 向指定行显示指定文本
  195. ;源码始:
  196. show1:  push di
  197.                 push bx
  198.                 push cx
  199.                 push si
  200.                 push dx
  201.                 mov bp,sp
  202.                 mov ax,[bp+12h]
  203.                 mov ds,ax
  204.                 mov ax,0b800h  ;屏幕显示地址
  205.         mov es,ax
  206.                 mov ax,[bp+0eh] ;行
  207.                
  208.                 add ax,4
  209.         mov bx,160   ;第一行4*160
  210.                 mul bx
  211.         mov bx,ax       
  212.         mov si,[bp+0ch]
  213.                 mov di,0
  214. show_s1:mov cl,ds:[di]     ;ds:[di]指向文本byte单元                 
  215.                 mov ch,0  
  216.         jcxz show_s0;如果=0直接返回
  217.                 mov ch,[bp+10h]      ;颜色
  218.         mov es:[bx][si],cx ;显示
  219.         add si,2
  220.                 inc di
  221.        
  222.                
  223.         loop show_s1
  224. show_s0:pop dx
  225.                 pop si
  226.                 pop cx
  227.                 pop bx
  228.                 pop di
  229.                 ret 8
  230. ;源码终



  231. codesg ends
  232. end  start
复制代码
最佳答案
2017-1-10 07:05:45
泡泡吧 发表于 2017-1-10 05:46
自己解决了,终于知道问题出现在哪里了.dtoc 中

;功能名: dtoc

精简后代码如下:
  1. assume cs:codesg ,ss:data,ds:table

  2. data segment   
  3.    db '1975','1976','1977','1978','1979','1980','1981','1982','1983'   
  4.    db '1984','1985','1986','1987','1988','1989','1990','1991','1992'   
  5.    db '1993','1994','1995'
  6.    ;年份字符串数组
  7.    dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514   
  8.    dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000     
  9.    ;年总收入数组        
  10.    dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226   
  11.    dw 11452,14430,15257,17800  
  12.    ;年人总数数组
  13. data ends

  14. table segment
  15.   db 42 dup (0)
  16. table ends


  17. codesg segment       
  18. start:        mov bx,0
  19.                 mov di,0
  20.                 mov dx,0
  21.                 mov cx,15h
  22.                 mov ax,table
  23.                 mov ds,ax
  24.                 mov ax,data
  25.                 mov ss,ax
  26. s:                mov si,0
  27.                 mov ax,word ptr ss:[bx]               
  28.                 mov word ptr ds:[si],ax
  29.                
  30.                 mov ax,word ptr ss:[bx].2
  31.                 mov word ptr ds:[si].2,ax ;年份装入ds:si中
  32.                 add si,6
  33.                
  34.                 push dx ;入栈显示行
  35.                 mov ax, word ptr ss:[bx].54h
  36.                 push ax
  37.                 mov ax, word ptr ss:[bx].56h
  38.                 push ax
  39.                 call dtoc ;收入转入ds:si
  40.                 add si,8
  41.                
  42.                 mov ax,word ptr ss:[di].0a8h
  43.                 push ax
  44.                 mov ax,0
  45.                 push ax
  46.                 call dtoc ;人员转入ds:si中
  47.                 add si,4
  48.                
  49.                
  50.                 push cx ;入栈cx,保存循环次数
  51.                 mov ax, word ptr ss:[bx].54h
  52.                 push ax
  53.                 mov ax, word ptr ss: [bx].56h
  54.                 push ax
  55.                 mov cx,word ptr ss:[di].0a8h
  56.                 call divdw  ;平均收入转入ds:si中
  57.                 pop cx   ;出栈cx,取出循环次数
  58.                 push ax
  59.                 push dx
  60.                 call dtoc
  61.                                
  62.                 mov si,0
  63.                 mov ax,24h
  64.                 push ax
  65.                 call dtoc1 ;将ds:si中的字符串0转为空格
  66.                
  67.                 pop dx
  68.                 mov ax,02 ;颜色
  69.                 push ax   ;颜色
  70.                 push dx   ;行
  71.                 mov ax,0
  72.                 push ax
  73.                 call show1; 将数值显示在屏幕上               
  74.                
  75.                
  76.                 inc dx
  77.                 add di,2
  78.                 add bx,4
  79.                
  80.                 loop s
  81.                
  82.                        
  83.                 mov ax,4c00h
  84.                 int 21h       
  85.                

  86. ;功能名: dtoc1
  87. ;说明: 将指定长度ds:si中的字符串0转为空格
  88. ;参数: ax=长度,ds:si指向字符串首地址
  89. ;结果: (ds:si)指向字符串的首地址,字符串以0结尾               
  90. ;源码始
  91. dtoc1:        mov bp,sp
  92.                 push cx
  93.                 mov cx,[bp+2] ;将长度赋值给cx
  94. e:                push cx  ;保存长度
  95.                 mov cl,ds:[si]  ;获取ds:si字符
  96.                 jcxz b   ;是否为零,如果为零调到b,进行转为空格
  97. c:                inc si   ;不为零,ds:si 指向下一个字符
  98.                 pop cx   ;取出cx,
  99.                 loop e
  100.                 mov al,0
  101.                 mov ds:[si],al;字符串以0结尾
  102.                 pop cx
  103.                 ret 2               
  104. b:                mov al,20h
  105.                 mov ds:[si],al
  106.                 jmp short c
  107. ;源码终
  108. ;功能名: dtoc
  109. ;说明: 将word型数据转变为表示十进制数的字串符,字符串以0结尾,最大转换15byte字符
  110. ;参数: ax=dword型数据低16位
  111. ;参数: dx=dword型数据高16位
  112. ;结果: (ds:si)指向字符串的首地址
  113. ;源码始
  114. dtoc:        push dx
  115.                 push di
  116.                 push cx
  117.                 mov bp,sp
  118.                 mov di,0
  119.                 mov ax,[bp+0ah] ;(ax)
  120.                 mov dx,[bp+08h] ;(dx)
  121. dtocz:        push ax
  122.                 push dx
  123.                 mov cx,0ah
  124.                 call divdw  ;进行除法               
  125.                 add cl,30h  ;余数转为字符串
  126.                 mov ch,0        ;高位=0       
  127.                 push cx     ;入栈字符串
  128.                 inc di      ;记录字符个数
  129.                 mov cx,dx   
  130.                 jcxz dtocr  ;如果 余数为0  
  131. dtocr:        mov cx,ax   ;如果商为零,跳到dtoct ,跳出循环,
  132.                 jcxz dout
  133.                 mov cx,bx; 将被除数赋值给cx
  134.                 jmp short dtocz ;如果商不为零继续除               
  135. dout:         mov cx,di
  136. dtoct:        pop ax
  137.                 mov byte ptr ds:[si],al ;写入[ds:si]中
  138.                 inc si
  139.                 loop dtoct
  140.                 pop cx       
  141.                 pop di
  142.                 pop dx
  143.                 ret 4
  144. ;源码终
  145. ;功能名: divdw
  146. ;说明: 进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型
  147. ;参数: push ax=dword型数据低16位
  148. ;参数: push dx=dword型数据高16位
  149. ;参数: cx=word型数据被除数
  150. ;返回: dx=结果的高16位,ax=结果的低16位 cx=余数
  151. ;源码始
  152. divdw:  
  153.                 push si
  154.                 mov bp,sp
  155.                 mov ax,[bp+4] ;高16位数据
  156.                 mov dx,0
  157.                 div cx      
  158.                 mov si,ax  ;保存高位商
  159.                 mov ax,[bp+6] ;低16位数据
  160.                 div cx       
  161.                 mov cx,dx
  162.                 mov dx,si  ;赋值给dx,高位商
  163.                 pop si
  164.                 ret        4                       
  165. ;源码终

  166. ;功能名: show1
  167. ;说明: 向屏幕显示文本,以零结尾文本
  168. ;参数: push ax 文本,以零结尾
  169. ;参数: push ax 文本颜色,
  170. ;参数: push ax 行,从零开始 范围(0-24)
  171. ;参数: push ax 列,从零开始 范围(0-80),偶数递增
  172. ;结果: 向指定行显示指定文本
  173. ;源码始:
  174. show1:  push di
  175.                 push bx
  176.                 push cx
  177.                 push si
  178.                 push dx
  179.                 mov bp,sp
  180.                 mov ax,0b800h  ;屏幕显示地址
  181.         mov es,ax
  182.                 mov ax,[bp+0eh] ;行               
  183.                 add ax,4
  184.         mov bx,160   ;第一行4*160
  185.                 mul bx
  186.         mov bx,ax       
  187.         mov si,[bp+0ch] ;列
  188.                 mov di,0
  189. show_s1:mov cl,ds:[di]     ;ds:[di]指向文本byte单元                 
  190.                 mov ch,0  
  191.         jcxz show_s0;如果=0直接返回
  192.                 mov ch,[bp+10h]      ;颜色
  193.         mov es:[bx][si],cx ;显示
  194.                 mov al,0
  195.                 mov ds:[di],al;显示后清除数据以免错乱
  196.         add si,2
  197.                 inc di
  198.                
  199.         loop show_s1
  200. show_s0:pop dx
  201.                 pop si
  202.                 pop cx
  203.                 pop bx
  204.                 pop di
  205.                 ret 6
  206. ;源码终



  207. codesg ends
  208. end  start
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-1-10 05:46:21 | 显示全部楼层
自己解决了,终于知道问题出现在哪里了.dtoc 中

;功能名: dtoc
;说明: 将word型数据转变为表示十进制数的字串符,字符串以0结尾,最大转换15byte字符
;参数: ax=dword型数据低16位
;参数: dx=dword型数据高16位
;参数: bx=word型数据,如果除数为0表示求(dx)(ax)/0ah十进制数的字串符,非0表示进行divdw转变为十进制数的字串符
;结果: (ds:si)指向字符串的首地址
;源码始
dtoc:        push dx
                push di
                push cx               
                mov bp,sp
                mov di,0
                mov ax,[bp+0ch] ;(ax)
                mov dx,[bp+0ah] ;(dx)
dtocs:        mov cx,[bp+8] ;型数据,如果除数为0表示求(dx)(ax)/0ah十进制数的字串符,非0表示进行divdw转变为十进制数的字串符
                jcxz dtocz
                push ax     ;非0表示进行divdw转变为十进制数的字串符
                push dx
                push cx
dtocc:        call divdw
                jmp short dtoce
dtocz:        push ax
                push dx
                mov cx,0ah
                push cx   ;这里进行push 导致 mov cx,[bp+8],错位了.用另外一个寄存器保存下被除数就好了.
                jmp short dtocc
dtoce:        add cl,30h
                mov ch,0               
                push cx
                inc di
                mov cx,dx
                jcxz dtocr  ;如果 余数为0  
dtocr:        mov cx,ax
                jcxz dout
                jmp short dtocs ;如果商不为零继续除
               
dout:         mov cx,di
dtoct:        pop ax
                mov byte ptr ds:[si],al ;写入[ds:si]中
                inc si
                loop dtoct
                pop cx        
                pop di
                pop dx
                ret 6
;源码终

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-1-10 07:05:45 | 显示全部楼层    本楼为最佳答案   
泡泡吧 发表于 2017-1-10 05:46
自己解决了,终于知道问题出现在哪里了.dtoc 中

;功能名: dtoc

精简后代码如下:
  1. assume cs:codesg ,ss:data,ds:table

  2. data segment   
  3.    db '1975','1976','1977','1978','1979','1980','1981','1982','1983'   
  4.    db '1984','1985','1986','1987','1988','1989','1990','1991','1992'   
  5.    db '1993','1994','1995'
  6.    ;年份字符串数组
  7.    dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514   
  8.    dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000     
  9.    ;年总收入数组        
  10.    dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226   
  11.    dw 11452,14430,15257,17800  
  12.    ;年人总数数组
  13. data ends

  14. table segment
  15.   db 42 dup (0)
  16. table ends


  17. codesg segment       
  18. start:        mov bx,0
  19.                 mov di,0
  20.                 mov dx,0
  21.                 mov cx,15h
  22.                 mov ax,table
  23.                 mov ds,ax
  24.                 mov ax,data
  25.                 mov ss,ax
  26. s:                mov si,0
  27.                 mov ax,word ptr ss:[bx]               
  28.                 mov word ptr ds:[si],ax
  29.                
  30.                 mov ax,word ptr ss:[bx].2
  31.                 mov word ptr ds:[si].2,ax ;年份装入ds:si中
  32.                 add si,6
  33.                
  34.                 push dx ;入栈显示行
  35.                 mov ax, word ptr ss:[bx].54h
  36.                 push ax
  37.                 mov ax, word ptr ss:[bx].56h
  38.                 push ax
  39.                 call dtoc ;收入转入ds:si
  40.                 add si,8
  41.                
  42.                 mov ax,word ptr ss:[di].0a8h
  43.                 push ax
  44.                 mov ax,0
  45.                 push ax
  46.                 call dtoc ;人员转入ds:si中
  47.                 add si,4
  48.                
  49.                
  50.                 push cx ;入栈cx,保存循环次数
  51.                 mov ax, word ptr ss:[bx].54h
  52.                 push ax
  53.                 mov ax, word ptr ss: [bx].56h
  54.                 push ax
  55.                 mov cx,word ptr ss:[di].0a8h
  56.                 call divdw  ;平均收入转入ds:si中
  57.                 pop cx   ;出栈cx,取出循环次数
  58.                 push ax
  59.                 push dx
  60.                 call dtoc
  61.                                
  62.                 mov si,0
  63.                 mov ax,24h
  64.                 push ax
  65.                 call dtoc1 ;将ds:si中的字符串0转为空格
  66.                
  67.                 pop dx
  68.                 mov ax,02 ;颜色
  69.                 push ax   ;颜色
  70.                 push dx   ;行
  71.                 mov ax,0
  72.                 push ax
  73.                 call show1; 将数值显示在屏幕上               
  74.                
  75.                
  76.                 inc dx
  77.                 add di,2
  78.                 add bx,4
  79.                
  80.                 loop s
  81.                
  82.                        
  83.                 mov ax,4c00h
  84.                 int 21h       
  85.                

  86. ;功能名: dtoc1
  87. ;说明: 将指定长度ds:si中的字符串0转为空格
  88. ;参数: ax=长度,ds:si指向字符串首地址
  89. ;结果: (ds:si)指向字符串的首地址,字符串以0结尾               
  90. ;源码始
  91. dtoc1:        mov bp,sp
  92.                 push cx
  93.                 mov cx,[bp+2] ;将长度赋值给cx
  94. e:                push cx  ;保存长度
  95.                 mov cl,ds:[si]  ;获取ds:si字符
  96.                 jcxz b   ;是否为零,如果为零调到b,进行转为空格
  97. c:                inc si   ;不为零,ds:si 指向下一个字符
  98.                 pop cx   ;取出cx,
  99.                 loop e
  100.                 mov al,0
  101.                 mov ds:[si],al;字符串以0结尾
  102.                 pop cx
  103.                 ret 2               
  104. b:                mov al,20h
  105.                 mov ds:[si],al
  106.                 jmp short c
  107. ;源码终
  108. ;功能名: dtoc
  109. ;说明: 将word型数据转变为表示十进制数的字串符,字符串以0结尾,最大转换15byte字符
  110. ;参数: ax=dword型数据低16位
  111. ;参数: dx=dword型数据高16位
  112. ;结果: (ds:si)指向字符串的首地址
  113. ;源码始
  114. dtoc:        push dx
  115.                 push di
  116.                 push cx
  117.                 mov bp,sp
  118.                 mov di,0
  119.                 mov ax,[bp+0ah] ;(ax)
  120.                 mov dx,[bp+08h] ;(dx)
  121. dtocz:        push ax
  122.                 push dx
  123.                 mov cx,0ah
  124.                 call divdw  ;进行除法               
  125.                 add cl,30h  ;余数转为字符串
  126.                 mov ch,0        ;高位=0       
  127.                 push cx     ;入栈字符串
  128.                 inc di      ;记录字符个数
  129.                 mov cx,dx   
  130.                 jcxz dtocr  ;如果 余数为0  
  131. dtocr:        mov cx,ax   ;如果商为零,跳到dtoct ,跳出循环,
  132.                 jcxz dout
  133.                 mov cx,bx; 将被除数赋值给cx
  134.                 jmp short dtocz ;如果商不为零继续除               
  135. dout:         mov cx,di
  136. dtoct:        pop ax
  137.                 mov byte ptr ds:[si],al ;写入[ds:si]中
  138.                 inc si
  139.                 loop dtoct
  140.                 pop cx       
  141.                 pop di
  142.                 pop dx
  143.                 ret 4
  144. ;源码终
  145. ;功能名: divdw
  146. ;说明: 进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型
  147. ;参数: push ax=dword型数据低16位
  148. ;参数: push dx=dword型数据高16位
  149. ;参数: cx=word型数据被除数
  150. ;返回: dx=结果的高16位,ax=结果的低16位 cx=余数
  151. ;源码始
  152. divdw:  
  153.                 push si
  154.                 mov bp,sp
  155.                 mov ax,[bp+4] ;高16位数据
  156.                 mov dx,0
  157.                 div cx      
  158.                 mov si,ax  ;保存高位商
  159.                 mov ax,[bp+6] ;低16位数据
  160.                 div cx       
  161.                 mov cx,dx
  162.                 mov dx,si  ;赋值给dx,高位商
  163.                 pop si
  164.                 ret        4                       
  165. ;源码终

  166. ;功能名: show1
  167. ;说明: 向屏幕显示文本,以零结尾文本
  168. ;参数: push ax 文本,以零结尾
  169. ;参数: push ax 文本颜色,
  170. ;参数: push ax 行,从零开始 范围(0-24)
  171. ;参数: push ax 列,从零开始 范围(0-80),偶数递增
  172. ;结果: 向指定行显示指定文本
  173. ;源码始:
  174. show1:  push di
  175.                 push bx
  176.                 push cx
  177.                 push si
  178.                 push dx
  179.                 mov bp,sp
  180.                 mov ax,0b800h  ;屏幕显示地址
  181.         mov es,ax
  182.                 mov ax,[bp+0eh] ;行               
  183.                 add ax,4
  184.         mov bx,160   ;第一行4*160
  185.                 mul bx
  186.         mov bx,ax       
  187.         mov si,[bp+0ch] ;列
  188.                 mov di,0
  189. show_s1:mov cl,ds:[di]     ;ds:[di]指向文本byte单元                 
  190.                 mov ch,0  
  191.         jcxz show_s0;如果=0直接返回
  192.                 mov ch,[bp+10h]      ;颜色
  193.         mov es:[bx][si],cx ;显示
  194.                 mov al,0
  195.                 mov ds:[di],al;显示后清除数据以免错乱
  196.         add si,2
  197.                 inc di
  198.                
  199.         loop show_s1
  200. show_s0:pop dx
  201.                 pop si
  202.                 pop cx
  203.                 pop bx
  204.                 pop di
  205.                 ret 6
  206. ;源码终



  207. codesg ends
  208. end  start
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-1 16:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表