xuechong 发表于 2012-8-19 18:48:20

百思不得其解错在哪里的汇编

编译时 竟然第一句就错了


assume cs:code,ds:data,ss:stack
data segment
      dw1,2,3,4,5,6,7,8,9
data ends

stack segment
   dw 0,0,0,0,0,0,0,0,0
stack ends

code segment
   
start:mov ax,b
          mov ss,ax
                  mov sp,009H
                  mov ax,a
                  mov ds,ax
                  mov bx,0
                  mov cx,8
        s:    push ds:
                  add bx,2
                  loop s
   code ends
   end start

augustus 发表于 2012-8-19 21:17:22

应该是mov ax,data
          mov ds,ax
          mov ax,stack
          mov ss,ax   吧
怎没会是a,b呢?你也没有标号啊

xuechong 发表于 2012-8-20 14:58:41

augustus 发表于 2012-8-19 21:17 static/image/common/back.gif
应该是mov ax,data
          mov ds,ax
          mov ax,stack


谢谢你,是我疏忽了。但是我改过之后,编译还是报错。第一段就提示错误

如果。。。 发表于 2012-8-20 15:31:06

start:mov ax,b
         mov ss,ax
   mov sp,009H
   mov ax,a
   mov ds,ax
   mov bx,0
   mov cx,8
s:    push ds:
   add bx,2
   loop s
让我们来分析分析你的代码。首先,从程序开始处start:
mov ax,b    我不知道你这个b是哪来的,我猜你是想设置栈段是不?,所以应该改成mov ax,stack
mov ss,ax    这句没错
mov sp,009h   这句应该是设置栈顶,可你指错地方了,根据你前面的内容,你把栈设置成了18个字节,也就是你所写的9个0
                        我不知道你为什么要写9个0,可能是手误多打了一个0,那么既然是9个0,sp就应该指向12h,怕你不明白,
                        特地配张图,那样更能直观的表现出来,图:http://ww1.sinaimg.cn/mw690/92c7cb9bgw1dw36dy2oegj.jpg
好,我们继续向下分析。
mov ax,a      我又纳闷了,不知道你这个a是哪来的。我猜你是想设置数据段的是不?
                     应该改成   mov ax,data就好了
mov bx,0       这句没问题
mov cx,8       设置循环次数为8,但你前面数据段有9个数字,次数不够,所以应该改为
                     mov cx,9
s:    push ds:
                  add bx,2
                  loop s          这几句都没问题。
好了,总结如下。你应该对什么是标号和标号是干什么的可能没有理解。
下面是我修改后的代码,你用debug单步调试看看,注意用d ss:12和d ds:0 命令来查看栈中的数据和数据段中的数据。

assume cs:code,ds:data,ss:stack
data segment
      dw1,2,3,4,5,6,7,8,9
data ends

stack segment
    dw 0,0,0,0,0,0,0,0,0
stack ends                     

code segment
   
start:mov ax,stack
         mov ss,ax
          mov sp,0012H         ;设置栈段
          mov ax,data
          mov ds,ax
          mov bx,0                  ;设置数据段
          mov cx,9                   ;循环9次
s:      push ds:
          add bx,2
          loop s
code ends
end start

augustus 发表于 2012-8-20 17:03:36

xuechong 发表于 2012-8-20 14:58 static/image/common/back.gif
谢谢你,是我疏忽了。但是我改过之后,编译还是报错。第一段就提示错误

C:\Users\ZLM\Desktop\1.png
我在虚拟机上编译通过了,而且就算sp有错误也不会影响编译通过啊!

xuechong 发表于 2012-8-21 08:47:06

augustus 发表于 2012-8-20 17:03 static/image/common/back.gif
我在虚拟机上编译通过了,而且就算sp有错误也不会影响编译通过啊!

你在试试这个呢,难道我的编译器出错了
assume cs:code,ds:data               
data segment
   db 'welcome tomasm!' ;声明地址所存放的数据
   db '................' ;将要存放的目标地址
data ends
code segment
start: mov ax,data      ;
       mov ds,ax          ;把段地址设为data
           mov bx,0         ;偏移地址si设为0
           mov cx,8         ;循环次数8
s:           mov ax,0       ;
       mov 16,ax      ;把(ds:si)放进(ds:(16+si))中
           add bx,2         ;每次路过此处,si递增2
           loop s
           mov 4c00H
           int 21H
code ends
end start      

xuechong 发表于 2012-8-21 08:58:30

如果。。。 发表于 2012-8-20 15:31 static/image/common/back.gif
start:mov ax,b
         mov ss,ax
   mov sp,009H


非常感谢,你猜的一点都没错。是我太粗心了

xuechong 发表于 2012-8-21 08:59:06

augustus 发表于 2012-8-19 21:17 static/image/common/back.gif
应该是mov ax,data
          mov ds,ax
          mov ax,stack


是我太粗心了,其实是code和data 谢谢你

xuechong 发表于 2012-8-21 09:00:14

如果。。。 发表于 2012-8-20 15:31 static/image/common/back.gif
start:mov ax,b
         mov ss,ax
   mov sp,009H


非常感谢,你猜的一点都没错。是我太粗心了

xuechong 发表于 2012-8-21 09:54:03

augustus 发表于 2012-8-19 21:17 static/image/common/back.gif
应该是mov ax,data
          mov ds,ax
          mov ax,stack


嘿嘿 是的。我粗心了

xuechong 发表于 2012-8-21 09:54:53

augustus 发表于 2012-8-20 17:03 static/image/common/back.gif
我在虚拟机上编译通过了,而且就算sp有错误也不会影响编译通过啊!

问题解决了。谢谢你们
页: [1]
查看完整版本: 百思不得其解错在哪里的汇编