鱼C论坛

 找回密码
 立即注册
查看: 2272|回复: 19

实验十

[复制链接]
发表于 2014-8-23 22:23:02 | 显示全部楼层 |阅读模式

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

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

x
  1. assume cs:code

  2. data segment
  3. db 'Welcom to masm!',0
  4. data ends

  5. code segment
  6. start:   mov dh,8
  7.          mov dl,3
  8.                  mov cl,2
  9.                  mov ax,data
  10.                  mov ds,ax
  11.                  mov si,0
  12.                  call show_str
  13.                  
  14.                  mov ax,4c00h
  15.                  int 21h
  16.                  
  17.                  
  18. show_str:
  19.          mov ax,0b800h
  20.                  mov es,ax
  21.        
  22.          mov al,8     ;用8代dh为了,在其它程序用
  23.                  mov ah,160
  24.          mul ah
  25.                  mov cx,ax
  26.                  
  27.                  mov al,3     ;用3代dl为了,在其它程序用
  28.                  mov ah,2
  29.                  mul ah
  30.                  add cx,ax
  31.                  mov di,cx
  32.                  
  33.                  
  34.         str: push cx
  35.              mov cl,[si]
  36.                  mov ch,0
  37.                  jcxz ok
  38.                  
  39.                  mov al,[si]
  40.                  mov es:[di],al
  41.                  pop cx
  42.                  mov es:[di+1],cl
  43.                
  44.                  add di,2
  45.                  inc si
  46.                  jmp short str
  47.                  
  48.         ok:         pop cx
  49.              
  50.                  ret
  51.                  
  52.                  
  53. code ends
  54. end start
复制代码

实验十,作上二个,第二个没作上来;

第三个,显示出来了 有一点问题:数是倒过来的:mad:


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

使用道具 举报

 楼主| 发表于 2014-8-23 22:23:37 | 显示全部楼层
  1. assume cs:code,ds:data

  2. data segment
  3. dw 123,1266,1,8,3,38
  4. db 20 dup(0)
  5. data ends

  6. code segment

  7. start:   
  8.           mov ax,data
  9.                   mov ds,ax
  10.                   mov bx,0
  11.                   mov cx,6
  12.                   
  13.                   mov si,16
  14.                   
  15.                   push si
  16.                   
  17.         s00:  push cx
  18.        
  19.                   mov ax,[bx]
  20.                   mov dx,10
  21.         s0:          div dl
  22.                   mov cl,ah
  23.                   mov ch,0
  24.                   jcxz s1
  25.                  
  26.                   push ax      ;保护ah
  27.                   add ah,30h
  28.                   mov [si],ah
  29.                   
  30.                   pop ax
  31.                   mov ah,0
  32.                   inc si
  33.                   jmp s0
  34.         s1:          add bx,2
  35.              
  36.                   pop cx
  37.                   loop s00
  38.                   
  39.                   pop si
  40.        
  41.                   call show_str
  42.                   
  43.                   mov ax,4c00h
  44.                   int 21h
  45.                   
  46. show_str:
  47.          mov ax,0b800h
  48.                  mov es,ax
  49.        
  50.          mov al,8     ;用8代dh为了,在其它程序用
  51.                  mov ah,160
  52.          mul ah
  53.                  mov cx,ax
  54.                  
  55.                  mov al,3     ;用3代dl为了,在其它程序用
  56.                  mov ah,2
  57.                  mul ah
  58.                  add cx,ax
  59.                  mov di,cx
  60.                  
  61.                  
  62.         str: push cx
  63.              mov cl,[si]
  64.                  mov ch,0
  65.                  jcxz ok
  66.                  
  67.                  mov al,[si]
  68.                  mov es:[di],al
  69.                  pop cx
  70.                  mov es:[di+1],cl
  71.                
  72.                  add di,2
  73.                  inc si
  74.                  jmp short str
  75.                  
  76.         ok:         pop cx
  77.              
  78.                  ret                  
  79.                   
  80.                   
  81.                   
  82.                   
  83.                   
  84.                   
  85.                  
  86.   code ends
  87.                   
  88. end start
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-24 23:33:37 | 显示全部楼层
原来这么简单,我歪曲了题义,题目一,当中给定了dh=8,dl=3;cl=2,后面,被我一顿乱改:lol:
还好,结果只有一点点偏离(行和列都没有减1)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-25 12:32:16 | 显示全部楼层

RE: 实验十

  1. <p>assume cs:code,ds:data,ss:stack

  2. data segment
  3. dw 123,12666,1,8,3,38,0,0
  4. dw 32 dup(0)
  5. data ends

  6. stack segment
  7. db 32 dup(0)
  8. stack ends

  9. code segment

  10. start:   
  11.                   mov ax,data
  12.                   mov ds,ax
  13.                                   mov ax,stack
  14.                                   mov ss,ax
  15.                                   mov sp,64
  16.                   mov bx,0
  17.                                   
  18.                                   
  19.                                   mov dx,0
  20.                                   
  21.         w0:       mov ax,[bx]   ;
  22.                                   mov cx,ax
  23.                                   jcxz s00
  24.                                   push ax
  25.                                   add bx,2
  26.                                   inc dx
  27.                                   loop w0
  28.                                   mov cx,dx
  29.                                   
  30.                                   
  31.                   
  32.         s00:     
  33.                          pop ax
  34.                                  call dtoc
  35.                                  loop s00
  36.                
  37.                      
  38.                                   
  39.                 s01:      mov dh,8            ;初始化显示位置
  40.                                   mov dl,3
  41.                                   mov cx,0cah
  42.         
  43.                   call show_str
  44.                   
  45.                   mov ax,4c00h
  46.                   int 21h       

  47.                                   

  48. dtoc :           push dx
  49.                  push cx
  50.                                  push ax
  51.                                  push si
  52.                                  push bx


  53.                   
  54.                   mov bx,0        ;bx在子程序中用来存放位数,用栈来临时存放修改后的字符
  55.                   
  56.            s1:    mov cx,10
  57.                                   mov dx,0       ;把用来存放余数的DX清零
  58.                   div cx
  59.                           mov cx,ax      ;得到的商赋值给CX
  60.                   jcxz s2       ;如果CX=0则跳到S1
  61.                  
  62.                   
  63.                   add dx,30h      ;余数加30H,得到相应的ASCII码
  64.                                   push dx          ;保存到栈
  65.                   inc bx
  66.                   
  67.                   jmp short s1
  68.                                   
  69.                                   
  70.            s2:    add dx,30h       ;商为0时,余数为个位
  71.                           push dx
  72.                                   
  73.                                   inc bx           ;再进行一次栈操作,(补充当“商为零而余数不为零”时的情况)
  74.                           
  75.                                   mov cx,bx        ;用CX出栈,把总进栈次数给CX
  76.                                   mov si,0
  77.                                   
  78.                    s3:          pop ax           ;s3实现将栈中的数据依次出栈,放到指定内存
  79.                           
  80.                                   mov [si],al
  81.                                   inc si
  82.                                   
  83.                                   loop s3
  84.                                   
  85.                                   
  86.                                   
  87.                                   
  88.         okay:                  pop bx
  89.                       pop si
  90.                                   pop ax
  91.                                   pop cx
  92.                                   pop dx


  93.                               ret



  94.                                   
  95. show_str:push cx   ;在指定位置显示字符,dh=行号(0-24),dl=列号(0-79),cx=颜色,ds:si指向字符串首地址
  96.          push si
  97.                  
  98.          mov ax,0b800h  ;显存的开始地址
  99.                  mov es,ax      ;ES中存放是显存的第0页(共0-7页)的起始段地址
  100.        
  101.          mov al,160     ;每行80字符即160字节
  102.          dec dh         ;第八行
  103.                  mul dh
  104.                  mov bx,ax
  105.                  
  106.                  mov al,2      ;一个字符占二字节
  107.                  dec dl        ;列从零开始,第三列,所以减一
  108.                  mul dl
  109.                      
  110.                  add bx,ax      ;此时BX中放的是行与列的偏移地址
  111.                  mov di,0        ;di 指向显存的偏移地址
  112.                  mov al,cl       ;把颜色参数,放到al
  113.                  mov ch,0         ;把CX高位置0
  114.                  
  115.                  
  116.         str: mov cl,ds:[si]   ;ds:[si]指向‘Wlcome to masm!',0
  117.                  jcxz ok          ;当CL为0时,跳到ok处
  118.                  
  119.        
  120.                  mov es:[bx+di],cl    ;偶字节放字符
  121.                  mov es:[bx+di+1],al  ;奇字节放,颜色属性
  122.                  inc si
  123.                  add di,2              ;指向下个字符
  124.                  
  125.                  jmp short str         ;无条件跳转,jcxz是离开的关键跳!
  126.                  
  127.         ok:         pop si
  128.              pop cx
  129.              
  130.                  ret                    ;显示字符串的子程序【定义结束】
  131.                   
  132.                   
  133.                   
  134.                   
  135.                   
  136.                  
  137.   code ends
  138.                   
  139. end start</p><p>
  140. </p><p>第一次查看:进入DEBUG后,如图“第一次查看”</p><p>第二次查看:在“w0:       mov ax,[bx]   ;”第二次查看“</p><p>程序都变样了???? 这是怎么回事,求 助??

  141. </p>
复制代码
第二次查看.jpg
第一次查看.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-25 13:19:14 | 显示全部楼层
我写的代码段内容为何会变???求助???
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-26 22:49:24 | 显示全部楼层
这是为什么呀?:sad

DOS 6.0 你们手里还有么? 用U盘进DOS运行下,看下什么样子
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-29 21:05:40 | 显示全部楼层
这样的事,总遇到 ,明明写一行代码,在执行的时候,直接跳过去,不知道为什么
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-29 21:06:56 | 显示全部楼层
  1. assume cs:code,ss:stack,ds:data,es:data1

  2. data segment
  3. dd 1975,1976,1977,1978,1979,1980,1981,1982,1983
  4. dd 1984,1985,1986,1987,1988,1989,1990,1991,1992
  5. dd 1993,1994,1995,0

  6. dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
  7. dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000,0

  8. dd 3,7,9,13,28,38,130,220,476,778,1101,1442,2258,2793,4037,5635,8226
  9. dd 11542,14430,15257,17800,0

  10. data ends


  11. stack segment
  12. db 64 dup(0)
  13. stack ends

  14. data1 segment
  15. dd 80 dup(0)
  16. data1 ends

  17. code segment

  18. start:   

  19.             mov ax,data
  20.                         mov ds,ax
  21.                         mov ax,stack
  22.                         mov ss,ax
  23.                         mov sp,128
  24.                         mov ax,data1
  25.                         mov es,ax
  26.                        
  27.                         mov bx,0
  28.                         mov bp,0
  29.                        
  30.                        
  31.                        
  32.                         mov dx,0      ;用dx作次数
  33.                        
  34.                
  35.         Sa:                    ;将年份或人数或平均值之一入栈
  36.                         mov ax,[bx]
  37.                         mov cx,ax
  38.                         jcxz sa1        ;当Cx为0时,跳到s1处
  39.                        
  40.                         push ax
  41.                         mov ax,[bx+2]
  42.                         push ax
  43.                         add dx,2       ;一次循环压二次栈
  44.                         add bx,4
  45.                         inc bp  
  46.                         loop sa
  47.                        
  48.                         mov cx,bp    ;入栈次数给CX
  49.                        
  50.                        
  51.                
  52.         sa1:                                   ;将入栈的数据转化为ASC11码
  53.                  pop dx
  54.                      pop ax
  55.                          push cx        ;保护CX次数
  56.                          
  57.                          mov si,82
  58.                          call dtoc
  59.                          sub si,di     ;bi中放的是数据长度
  60.                          mov di,0       ;长度清零
  61.                          
  62.                          
  63.                          
  64.                          
  65.                          
  66.                          
  67.                          pop cx
  68.                          inc cx
  69.                          loop sa1
  70.                          
  71.                          
  72.                          
  73.                          
  74.                          
  75.                          
  76.                         mov ax,4c00h
  77.                         int 21h
  78.                        
  79.                          
  80.                          
  81.                
  82.                   
  83.              
  84.                   
  85.                   
  86.                        
  87.                        

















  88. divdw:  ;参数:(ax)=dword型数据的低16位,(dx)=dword型数据的高16位,(cx)=除数
  89.         ;返回:(dx)=结果的高16位,(ax)=结果的低16位,(cx)=余数

  90.          push ax        ;低16位先保存
  91.                  mov ax,dx    ;ax这时候的值是高16位了
  92.                  mov dx,0       ;dx置零是为了不影响下边余数位,使得高16位为0
  93.                  
  94.                  div cx          ;H/N(16位除法)
  95.                  mov bx,ax       ;ax,bx的值为int(商)H/N,dx的值为rem(余数)
  96.                   
  97.                  
  98.                  pop ax          ;ax的值现在是L(低16位)
  99.                  div cx          ;L/N(16除法),ax被除数低16位,dx被除数高16位
  100.                  
  101.                  mov cx,dx
  102.                  mov dx,bx
  103.                  
  104.                  
  105.                  ret
  106.                  
  107.                  







  108. show_str: ;在指定位置显示字符,dh=行号(0-24),dl=列号(0-79),cx=颜色
  109.           ; ds:si指向字符串首地址
  110.                   
  111.          push cx   
  112.          push si
  113.                  
  114.          mov ax,0b800h  ;显存的开始地址
  115.                  mov es,ax      ;ES中存放是显存的第0页(共0-7页)的起始段地址
  116.        
  117.          mov al,160     ;每行80字符即160字节
  118.          dec dh         ;第八行
  119.                  mul dh
  120.                  mov bx,ax
  121.                  
  122.                  mov al,2      ;一个字符占二字节
  123.                  dec dl        ;列从零开始,第三列,所以减一
  124.                  mul dl
  125.                      
  126.                  add bx,ax      ;此时BX中放的是行与列的偏移地址
  127.                  mov di,0        ;di 指向显存的偏移地址
  128.                  mov al,cl       ;把颜色参数,放到al
  129.                  mov ch,0         ;把CX高位置0
  130.                  
  131.                  
  132.         str: mov cl,ds:[si]   ;ds:[si]指向‘Wlcome to masm!',0
  133.                  jcxz ok          ;当CL为0时,跳到ok处
  134.                  
  135.        
  136.                  mov es:[bx+di],cl    ;偶字节放字符
  137.                  mov es:[bx+di+1],al  ;奇字节放,颜色属性
  138.                  inc si
  139.                  add di,2              ;指向下个字符
  140.                  
  141.                  jmp short str         ;无条件跳转,jcxz是离开的关键跳!
  142.                  
  143.         ok:         pop si
  144.              pop cx
  145.              
  146.                  ret                    ;显示字符串的子程序【定义结束】
  147.                  
  148.                  
  149.                  
  150.                  
  151.         dtoc :                      ;抽取数字,并转化为SACII码

  152.                  push dx
  153.                  push cx
  154.                                  push ax
  155.                                  push si
  156.                                  push bx


  157.                   
  158.                   mov bx,0        ;bx在子程序中用来存放位数,用栈来临时存放修改后的字符
  159.                   
  160.            s1:    mov cx,10
  161.                                   ;mov dx,0       ;把用来存放余数的DX清零
  162.                   
  163.                                   call divdw
  164.                                  ; mov dx,cx        ;r把余数给dx
  165.                                   
  166.                           
  167.                                   ;mov cx,ax      ;得到的商赋值给CX
  168.                   jcxz s2       ;如果CX=0则跳到S1
  169.                  
  170.                   
  171.                   add cx,30h      ;余数加30H,得到相应的ASCII码
  172.                                   push cx          ;保存到栈
  173.                   inc bx
  174.                   
  175.                   jmp short s1
  176.                                   
  177.                                   
  178.            s2:    add dx,30h       ;商为0时,余数为个位
  179.                           push dx
  180.                                   
  181.                                   inc bx           ;再进行一次栈操作,(补充当“商为零而余数不为零”时的情况)
  182.                           
  183.                                   mov cx,bx        ;用CX出栈,把总进栈次数给CX
  184.                                   mov di,cx        ;本程序中,用来保存长度
  185.                                   mov si,82
  186.                                   
  187.                    s3:          pop ax           ;s3实现将栈中的数据依次出栈,放到指定内存
  188.                           
  189.                                   mov es:[si],al
  190.                                   inc si
  191.                                   
  192.                                   loop s3
  193.                                   
  194.                                   
  195.                                   
  196.                                   
  197.         okay:                  pop bx
  198.                       pop si
  199.                                   pop ax
  200.                                   pop cx
  201.                                   pop dx


  202.                               ret
  203.          
  204.                   
  205.                  
  206.         code ends
  207. end start
  208.        
  209.                  
复制代码


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

使用道具 举报

 楼主| 发表于 2014-8-29 21:09:47 | 显示全部楼层
上面是一个,没有完成的,程序;
当执行到第56行时,用P命令跳循环,会直接结束;
执行完56行,不执行58行,视58行如无物,晕死
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-29 21:12:10 | 显示全部楼层
用G 命令跳到58行,会死!
用G 命令跳到63行,则完全没问题;但会发现58行没有执行,cx=0000;晕死
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-29 21:13:17 | 显示全部楼层

58行为何不执行,求解?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-29 21:24:01 | 显示全部楼层
haiouda 发表于 2014-8-29 21:13
58行为何不执行,求解?

1. 47行为何要给cx反复赋值,这样循环可以能跳出来么?
2. 我有个疑问请示下:dx可以循环计数么?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-29 21:33:36 | 显示全部楼层
小靚同学Leon 发表于 2014-8-29 21:24
1. 47行为何要给cx反复赋值,这样循环可以能跳出来么?
2. 我有个疑问请示下:dx可以循环计数么?

第一次赋值,是为了,接下来的一行,看是否到搂据尾了;

第二次赋值,是统计一共进栈多少次;

第二次赋值覆盖第一次赋值;
mov cx,ax
.
.
.
mov cx,bp

cx中应该是第二次的赋值,我是这么认为的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-29 21:35:11 | 显示全部楼层
小靚同学Leon 发表于 2014-8-29 21:24
1. 47行为何要给cx反复赋值,这样循环可以能跳出来么?
2. 我有个疑问请示下:dx可以循环计数么?

在,二次给CX,赋值中间要加上一条,mov cx,0;这样应对了么?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-29 21:36:14 | 显示全部楼层
小靚同学Leon 发表于 2014-8-29 21:24
1. 47行为何要给cx反复赋值,这样循环可以能跳出来么?
2. 我有个疑问请示下:dx可以循环计数么?

我没有其它的计数器了,临时借用下DX
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-29 21:41:21 | 显示全部楼层
小靚同学Leon 发表于 2014-8-29 21:24
1. 47行为何要给cx反复赋值,这样循环可以能跳出来么?
2. 我有个疑问请示下:dx可以循环计数么?

谢谢,在二次给CX赋值中间加一条,MOV CX,0 ,就好了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-29 21:52:23 | 显示全部楼层
  1. assume cs:code,ss:stack,ds:data,es:data1

  2. data segment
  3. dd 1975,1976,1977,1978,1979,1980,1981,1982,1983
  4. dd 1984,1985,1986,1987,1988,1989,1990,1991,1992
  5. dd 1993,1994,1995,0

  6. dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
  7. dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000,0

  8. dd 3,7,9,13,28,38,130,220,476,778,1101,1442,2258,2793,4037,5635,8226
  9. dd 11542,14430,15257,17800,0

  10. data ends


  11. stack segment
  12. db 64 dup(0)
  13. stack ends

  14. data1 segment
  15. dd 80 dup(0)
  16. data1 ends

  17. code segment

  18. start:   

  19.             mov ax,data
  20.                         mov ds,ax
  21.                         mov ax,stack
  22.                         mov ss,ax
  23.                         mov sp,128
  24.                         mov ax,data1
  25.                         mov es,ax
  26.                        
  27.                         mov bx,0
  28.                         mov bp,0
  29.                        
  30.                        
  31.                        
  32.                         mov dx,0      ;用dx作次数
  33.                        
  34.                
  35.         Sa:                    ;将年份或人数或平均值之一入栈
  36.                         mov ax,[bx]
  37.                         mov cx,ax
  38.                         jcxz sa1        ;当Cx为0时,跳到s1处
  39.                        
  40.                         push ax
  41.                         mov ax,[bx+2]
  42.                         push ax
  43.                         add dx,2       ;一次循环压二次栈
  44.                         add bx,4
  45.                         inc bp  
  46.                         loop sa
  47.                        
  48.                          
  49.                         mov cx,0
  50.                         mov cx,bp    ;入栈次数给CX
  51.                        
  52.                        
  53.                
  54.         sa1:                                   ;将入栈的数据转化为ASC11码
  55.                  pop dx
  56.                      pop ax
  57.                          push cx        ;保护CX次数
  58.                          
  59.                          mov si,82
  60.                          call dtoc
  61.                          sub si,di     ;bi中放的是数据长度
  62.                          mov di,0       ;长度清零
  63.                          
  64.                          
  65.                          
  66.                          
  67.                          
  68.                          
  69.                          pop cx
  70.                          inc cx
  71.                          loop sa1
  72.                          
  73.                          
  74.                          
  75.                          
  76.                          
  77.                          
  78.                         mov ax,4c00h
  79.                         int 21h
  80.                        
  81.                          
  82.                          
  83.                
  84.                   
  85.              
  86.                   
  87.                   
  88.                        
  89.                        

















  90. divdw:  ;参数:(ax)=dword型数据的低16位,(dx)=dword型数据的高16位,(cx)=除数
  91.         ;返回:(dx)=结果的高16位,(ax)=结果的低16位,(cx)=余数

  92.          push ax        ;低16位先保存
  93.                  mov ax,dx    ;ax这时候的值是高16位了
  94.                  mov dx,0       ;dx置零是为了不影响下边余数位,使得高16位为0
  95.                  
  96.                  div cx          ;H/N(16位除法)
  97.                  mov bx,ax       ;ax,bx的值为int(商)H/N,dx的值为rem(余数)
  98.                   
  99.                  
  100.                  pop ax          ;ax的值现在是L(低16位)
  101.                  div cx          ;L/N(16除法),ax被除数低16位,dx被除数高16位
  102.                  
  103.                  mov cx,dx
  104.                  mov dx,bx
  105.                  
  106.                  
  107.                  ret
  108.                  
  109.                  







  110. show_str: ;在指定位置显示字符,dh=行号(0-24),dl=列号(0-79),cx=颜色
  111.           ; ds:si指向字符串首地址
  112.                   
  113.          push cx   
  114.          push si
  115.                  
  116.          mov ax,0b800h  ;显存的开始地址
  117.                  mov es,ax      ;ES中存放是显存的第0页(共0-7页)的起始段地址
  118.        
  119.          mov al,160     ;每行80字符即160字节
  120.          dec dh         ;第八行
  121.                  mul dh
  122.                  mov bx,ax
  123.                  
  124.                  mov al,2      ;一个字符占二字节
  125.                  dec dl        ;列从零开始,第三列,所以减一
  126.                  mul dl
  127.                      
  128.                  add bx,ax      ;此时BX中放的是行与列的偏移地址
  129.                  mov di,0        ;di 指向显存的偏移地址
  130.                  mov al,cl       ;把颜色参数,放到al
  131.                  mov ch,0         ;把CX高位置0
  132.                  
  133.                  
  134.         str: mov cl,ds:[si]   ;ds:[si]指向‘Wlcome to masm!',0
  135.                  jcxz ok          ;当CL为0时,跳到ok处
  136.                  
  137.        
  138.                  mov es:[bx+di],cl    ;偶字节放字符
  139.                  mov es:[bx+di+1],al  ;奇字节放,颜色属性
  140.                  inc si
  141.                  add di,2              ;指向下个字符
  142.                  
  143.                  jmp short str         ;无条件跳转,jcxz是离开的关键跳!
  144.                  
  145.         ok:         pop si
  146.              pop cx
  147.              
  148.                  ret                    ;显示字符串的子程序【定义结束】
  149.                  
  150.                  
  151.                  
  152.                  
  153.         dtoc :                      ;抽取数字,并转化为SACII码

  154.                  push dx
  155.                  push cx
  156.                                  push ax
  157.                                  push si
  158.                                  push bx


  159.                   
  160.                   mov bx,0        ;bx在子程序中用来存放位数,用栈来临时存放修改后的字符
  161.                   
  162.            s1:    mov cx,10
  163.                                   ;mov dx,0       ;把用来存放余数的DX清零
  164.                   
  165.                                   call divdw
  166.                                  ; mov dx,cx        ;r把余数给dx
  167.                                   
  168.                           
  169.                                   ;mov cx,ax      ;得到的商赋值给CX
  170.                   jcxz s2       ;如果CX=0则跳到S1
  171.                  
  172.                   
  173.                   add cx,30h      ;余数加30H,得到相应的ASCII码
  174.                                   push cx          ;保存到栈
  175.                   inc bx
  176.                   
  177.                   jmp short s1
  178.                                   
  179.                                   
  180.            s2:    add dx,30h       ;商为0时,余数为个位
  181.                           push dx
  182.                                   
  183.                                   inc bx           ;再进行一次栈操作,(补充当“商为零而余数不为零”时的情况)
  184.                           
  185.                                   mov cx,bx        ;用CX出栈,把总进栈次数给CX
  186.                                   mov di,cx        ;本程序中,用来保存长度
  187.                                   mov si,82
  188.                                   
  189.                    s3:          pop ax           ;s3实现将栈中的数据依次出栈,放到指定内存
  190.                           
  191.                                   mov es:[si],al
  192.                                   inc si
  193.                                   
  194.                                   loop s3
  195.                                   
  196.                                   
  197.                                   
  198.                                   
  199.         okay:                  pop bx
  200.                       pop si
  201.                                   pop ax
  202.                                   pop cx
  203.                                   pop dx


  204.                               ret
  205.          
  206.                   
  207.                  
  208.         code ends
  209. end start
复制代码


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

使用道具 举报

 楼主| 发表于 2014-8-29 21:53:39 | 显示全部楼层
在二次给CX赋值,虽然不死机了,可以它还是乱跳,执行完56条就不知道跳哪去了,:dizzy:
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-29 22:41:31 | 显示全部楼层
haiouda 发表于 2014-8-29 21:53
在二次给CX赋值,虽然不死机了,可以它还是乱跳,执行完56条就不知道跳哪去了,

你的循环体sa......loop sa这个地方原本是没有设置CX的,可能是CX的问题。我的建议是你在大循环外设置一个CX计数,mov cx,ax这条不要用到cx,jcxz这条重新找指令替换。多半是计数没找到,所以乱跳。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-29 22:47:21 | 显示全部楼层
就是这个问题啦。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-1 05:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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