鱼C论坛

 找回密码
 立即注册
查看: 2308|回复: 11

0基础汇编入门实验7代码, 大家帮看看哪里出错,debug单步跟踪没看见结果,谢谢大家!

[复制链接]
发表于 2012-2-6 23:16:39 | 显示全部楼层 |阅读模式
1鱼币
assume cs:codesg,ds:datasg,ss:stacksg,es:table
stacksg segment
dw 21 dup(0)
stacksg ends
datasg segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1993','1994','1995'
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514       ;si=54h~0A7H
dd 345980,590827,803530,1183000,1843000,2759000,3753000,464900,5937000
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226    ;bp=A8h~D1H
dw 11542,14430,15257,17800
datasg ends
table segment
db 21 dup ('year summ ne ??')
table ends
codesg segment
start:mov ax,stacksg
      mov ss,ax
   mov sp,16h
   mov ax,datasg
   mov ds,ax
   mov ax,table
   mov es,ax
   mov si,0
   mov di,0
   mov bx,0
   mov cx,21
s0:   push cx
   mov cx,4
s:    mov al,[bx]
      mov es:[di],al
   inc bx
   inc di
   loop s
   mov bx,0
   mov di,0
      mov dx,56h[bx]
   mov ax,54h[bx]
   mov es:7h[di],dx
   mov es:5h[di],ax
   mov ax,0a8h[si]
   mov es:0ah[di],ax
   mov ax,54h[bx]
   mov dx,56h[bx]
   div word ptr ds:0a8h[si]
   mov es:0dh[di],ax
   add bx,4
   add si,2
   add di,16
   pop cx
   loop s0
   mov ax,4c00h
   int 21h
   codesg ends
end start
   
   

最佳答案

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-2-6 23:16:40 | 显示全部楼层
  1. assume cs:codesg,ds:datasg,ss:stacksg,es:table
  2. stacksg segment
  3. dw 21 dup(0)
  4. stacksg ends
  5. datasg segment
  6. db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
  7. db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
  8. db '1993','1994','1995'
  9. dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514       ;si=54h~0A7H
  10. dd 345980,590827,803530,1183000,1843000,2759000,3753000,464900,5937000
  11. dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226    ;bp=A8h~D1H
  12. dw 11542,14430,15257,17800
  13. datasg ends
  14. table segment
  15. db 21 dup ('year summ ne ??')
  16. table ends
  17. codesg segment
  18. start:
  19.         mov ax,stacksg
  20.     mov ss,ax
  21.         mov sp,16h
  22.     mov ax,datasg
  23.     mov ds,ax
  24.     mov ax,table
  25.     mov es,ax
  26.     mov si,0
  27.     mov di,0
  28.     mov bx,0
  29.     mov cx,21
  30. s1:
  31.         push di
  32.         mov al,ds:[si]
  33.         mov es:[di],al
  34.         inc si
  35.         inc di
  36.         pop di
  37.         add di,0a0h
  38.         loop s1
  39.         mov si,54h
  40.         mov di,10h
  41.         mov cx,21
  42. s2:
  43.         push di
  44.         mov dx,ds:[si]
  45.         mov ax,ds:[si+4]
  46.         mov es:[di],dx
  47.         mov es:[di+4],ax
  48.         add si,8
  49.         add di,8
  50.         pop di
  51.         add di,0a0h
  52.         loop s2
  53.         .
  54.         .
  55.         .                                ;下面再定义2个循环就行了
  56.         .
  57.         .
  58.     mov ax,4c00h
  59.     int 21h
  60. codesg ends
  61. end start
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-2-6 23:57:44 | 显示全部楼层
其他地方没有错,就这个地方mov sp,16h计算错你了;
应该是mov sp,2Ah

dw 21 dup(0)
=42=2AH
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-2-7 00:08:54 | 显示全部楼层
assume cs:codesg,ds:datasg,ss:stacksg,es:table
stacksg segment
dw 21 dup(0)       ;这是定义的栈段
stacksg ends
datasg segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1993','1994','1995'   ;以上是表示21年的21个字符串
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514      
dd 345980,590827,803530,1183000,1843000,2759000,3753000,464900,5937000
;以上是表示21年公司总收的21个dword型数据
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226   
dw 11542,14430,15257,17800  ;以上是表示21年公司雇员人数的21个word型数据
datasg ends
table segment
db 21 dup ('year summ ne ??')        ;以上是表格
table ends
codesg segment
start:mov ax,stacksg
      mov ss,ax
      mov sp,2Ah
      mov ax,datasg
      mov ds,ax
      mov ax,table
      mov es,ax
      mov si,0
      mov di,0
      mov bx,0
   
   mov cx,21
s0:push cx
   
   mov cx,4
s: mov al,[bx]
   mov es:[di],al
   inc bx
   inc di      ;以上4句的作用是存放年份
   loop s
   mov bx,0
   mov di,0   
     
   mov dx,56h[bx]
   mov ax,54h[bx]
   mov es:7h[di],dx
   mov es:5h[di],ax   ;以上4句的作用是存放公司总收人
   
   mov ax,0a8h[si]
   mov es:0ah[di],ax      ;以上2句是存放公司的人数
   
   mov ax,54h[bx]
   mov dx,56h[bx]
   div word ptr ds:0a8h[si]
   mov es:0dh[di],ax       ;以上4句是存放人均收入
   
   add bx,4
   add si,2
   add di,16    ;以上3句是为下一次循环时存放数据做准备
   
   pop cx
   loop s0    ;跳到标号s0处
   
   mov ax,4c00h
   int 21h
codesg ends
end start


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-2-7 00:34:53 | 显示全部楼层
assume cs:codesg,ds:datasg,ss:stacksg,es:table
stacksg segment
dw 21 dup(0)       ;这是定义的栈段
stacksg ends
datasg segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1993','1994','1995'   ;以上是表示21年的21个字符串
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514      
dd 345980,590827,803530,1183000,1843000,2759000,3753000,464900,5937000
;以上是表示21年公司总收的21个dword型数据
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226   
dw 11542,14430,15257,17800  ;以上是表示21年公司雇员人数的21个word型数据
datasg ends
table segment
db 21 dup ('year summ ne ??')        ;以上是表格
table ends
codesg segment
start:mov ax,stacksg
      mov ss,ax
      mov sp,2Ah
      mov ax,datasg
      mov ds,ax
      mov ax,table
      mov es,ax
      mov si,0
      mov di,0
      mov bx,0
   
   mov cx,21
s0:push cx
   
   mov cx,4
s: mov al,[bx]
   mov es:[di],al
   inc bx
   inc di      ;以上4句的作用是存放年份
   loop s
   mov bx,0    ;此处初始化错了,以至于后面的add bx,4; add si,2    mov di,0    ;没有起作用     
   mov dx,56h[bx]
   mov ax,54h[bx]
   mov es:7h[di],dx
   mov es:5h[di],ax   ;以上4句的作用是存放公司总收人
   
   mov ax,0a8h[si]
   mov es:0ah[di],ax      ;以上2句是存放公司的人数
   
   mov ax,54h[bx]
   mov dx,56h[bx]
   div word ptr ds:0a8h[si]
   mov es:0dh[di],ax       ;以上4句是存放人均收入
   
   add bx,4
   add si,2
   add di,16    ;以上3句是为下一次循环时存放数据做准备
   
   pop cx
   loop s0    ;跳到标号s0处
   
   mov ax,4c00h
   int 21h
codesg ends
end start

自己修改了一下代码,单步跟踪只看见前面的年代,后面看不见,不知道对不对。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-2-7 00:35:44 | 显示全部楼层
修改后的代码如下:
assume cs:codesg,ds:datasg,ss:stacksg,es:table
stacksg segment
dw 21 dup(0)
stacksg ends
datasg segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1993','1994','1995'
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514       ;si=54h~0A7H
dd 345980,590827,803530,1183000,1843000,2759000,3753000,464900,5937000
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226    ;bp=A8h~D1H
dw 11542,14430,15257,17800
datasg ends
table segment
db 21 dup ('year summ ne ??')
table ends
codesg segment
start:mov ax,stacksg
      mov ss,ax
          mov sp,16h
          mov ax,datasg
          mov ds,ax
          mov ax,table
          mov es,ax
          mov si,0
          mov di,0
          mov bp,0
          mov bx,0
          mov cx,21
s0:   push cx
          mov cx,4
s:    mov al,[bx+di]
      mov es:[bp+di],al
          inc di
          loop s
          mov di,0
      mov dx,56h[bx]
          mov ax,54h[bx]
          mov es:7h[bp],dx
          mov es:5h[bp],ax
          mov ax,0a8h[si]
          mov es:0ah[bp],ax
          mov ax,54h[bx]
          mov dx,56h[bx]
          div word ptr ds:0a8h[si]
          mov es:0dh[bp],ax
          add bx,4
          add si,2
          add bp,16
          pop cx
          loop s0
          mov ax,4c00h
          int 21h
          codesg ends
end start
          
          
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-2-7 00:36:47 | 显示全部楼层
这么晚了,还为我解答问题,不胜感激!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-2-7 02:09:33 | 显示全部楼层
哦!对了,di第一次循环不错,但是第二次就错了;
由此,可以得出一个结论:在同一循环体内,担当参与循环次数递增或递减的寄存器,不能赋一次以上不同的值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-2-7 04:30:02 | 显示全部楼层
;还可以这样做:在s循环前先push bx与push di然后在s循环结束后再pop di与pop bx
;我个人认为这样的程序,其思路更清晰,且少占用了一个寄存器,这样更适合大程序!

assume cs:codesg,ds:datasg,ss:stacksg,es:table

stacksg segment
dw 21 dup(0)       ;这是定义的栈段
stacksg ends

datasg segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1993','1994','1995'   ;以上是表示21年的21个字符串
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514      
dd 345980,590827,803530,1183000,1843000,2759000,3753000,464900,5937000
;以上是表示21年公司总收的21个dword型数据
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226   
dw 11542,14430,15257,17800  ;以上是表示21年公司雇员人数的21个word型数据
datasg ends

table segment
db 21 dup ('year summ ne ??')        ;以上是表格
table ends

codesg segment
start:mov ax,stacksg
      mov ss,ax
      mov sp,2Ah
      mov ax,datasg
      mov ds,ax
      mov ax,table
      mov es,ax
      mov si,0
      mov di,0
      mov bx,0
   
   mov cx,21
s0:push cx
   
   push bx
   push di
   mov cx,4
s: mov al,[bx]
   mov es:[di],al
   inc bx
   inc di      ;以上4句的作用是存放年份
   loop s
   pop di
   pop bx   
     
   mov dx,56h[bx]
   mov ax,54h[bx]
   mov es:7h[di],dx
   mov es:5h[di],ax   ;以上4句的作用是存放公司总收人
   
   mov ax,0a8h[si]
   mov es:0ah[di],ax      ;以上2句是存放公司的人数
   
   mov ax,54h[bx]
   mov dx,56h[bx]
   div word ptr ds:0a8h[si]
   mov es:0dh[di],ax       ;以上4句是存放人均收入
   
   add bx,4
   add si,2
   add di,16    ;以上3句是为下一次循环时存放数据做准备
   
   pop cx
   loop s0    ;跳到标号s0处
   
   mov ax,4c00h
   int 21h

codesg ends

end start




想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-2-7 07:39:50 | 显示全部楼层

高招,学习了,我是抓破头想出bp这个寄存器可用来 ,心里还想要是再有一个循环就没寄存器可用了,把bx,di放到栈中是好办法!!!,共同成长!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-2-7 07:52:41 | 显示全部楼层
问题已经解决,怎么放到已解决里面呢!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-9-26 15:58:06 | 显示全部楼层

学习,支持一下!加油
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 13:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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