螃蟹009 发表于 2013-3-4 19:49:00

汇编新手求助

我是对着书写的啊!怎么还是有错误!!求教哪里错误??assume cs:code, ds:data, ss:stack

data segment
            dw 0123h, 0456h
data ends

stack segment
            dw 0, 0
stack ends

code segment

start:    mov ax, stack
    mov ss, ax
    mov sp, 16

    mov ax, data
    mov ds, ax

    push ds:
    push ds:
    pop ds:
    pop ds:

    mov ax, 4c00h
    int 21h
   
code ends
end start

半生缘 发表于 2013-3-4 20:04:55

assume cs:code, ds:data, ss:stack
data segment
      dw 0123h, 0456h
data ends
stack segment
          dw 0, 0
stack ends
code segment
start:    mov ax, stack
    mov ss, ax
    mov sp, 16
    mov ax, data
    mov ds, ax
    push ds:
    push ds:
    pop ds:
    pop ds:
    mov ax, 4c00h
    int 21h
   
code ends
end start没问题啊 可以运行 不过我纳闷个问题你这个 栈段 定义的 看着这别扭呢
我没学好 也不知道他指到哪里去了

data:23 01 56 04 00 00 00 00 00 00 00 00 00 00 00 00
stack:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
code:B8 01 00 8E D0 BC 10 00 B8 00 00 8E D8 FF 36 00
00 FF 36 02 00 8F 06 02 00 8F 06 00 00 B8 00 4C
CD 21
幸好:L 虽然你 栈只定义了 两个字 但是他空出来 八个字

螃蟹009 发表于 2013-3-4 20:18:41

半生缘 发表于 2013-3-4 20:04 static/image/common/back.gif
没问题啊 可以运行 不过我纳闷个问题你这个 栈段 定义的 看着这别扭呢
我没学好 也不知道他指到哪里去了 ...

我用的RADASM,可是就是说变异错误!我是对着书上的代码写的啊!!

青草 发表于 2013-3-4 20:31:04

本帖最后由 青草 于 2013-3-4 20:44 编辑

楼主你栈越界了看看你干了什么
stack segment
          dw 0, 0   这里定义了两个字4个字节
stack ends
…………
    mov ss, ax
    mov sp, 16   你看你这向那里指的
…………
看你上面那栈指的 有可能会指到代码段上有时候源代码编译后
数据段、栈段、代码段都有可能用一个段地址
所以数据段结果后面跟着栈段,栈段结束后面跟着是代码段 而你的栈段小 就有可能越界指到代码段上

如果程序编译后不是以上结果的话 那就是你栈指到栈低越界了
例子
         0   1   2   3   4   5   6   7   8   9   A   B   C    D   F
ss:0000 00 00 00 52 a5 f1 00 33 00fa00cd00 34
ss:103f d3 a6..........
         |
          SP
红色你定义的栈的大小
蓝色为你指定SP后所超出的数据
加粗带下划线的数据就是你第一次push压栈后要覆盖的数据,加粗睡觉的数据是你第二次压栈要覆盖的数据

假设蓝色数据是你的代码段里的数据的话 你第一次压栈就会修改你代码段里的代码
假设蓝色数据是别的段的重要数据你这一下就修改这数据 CPU会帮你给踢了

反正问题就出现在你栈里

一看就是栈没有好好学

栈定义改成下面这样
stack segment
          dw 0,0,0,0,0,0,0,0   这里定义了8个字16个字节
stack ends



青草 发表于 2013-3-4 20:48:40

半生缘 发表于 2013-3-4 20:04 static/image/common/back.gif
没问题啊 可以运行 不过我纳闷个问题你这个 栈段 定义的 看着这别扭呢
我没学好 也不知道他指到哪里去了 ...

:funk:问题就在他的栈定义小了 保险起见 最小要定义16个字节只定义2个字节或4个字节的话基本95%会出现问题很容易出现栈溢出或栈越界

半生缘 发表于 2013-3-4 21:14:24

话说没问题 栈定义小了不要紧 至少 他生成时 不知道为啥 他会空出那一行 正好16个字节
可能主要原因是 你应该换个编译器 换成 鱼c 的 masm6.15 吧
我用的就是他 不过我加了个visualassembly 忘了那下载的了 不用去dos 就可以编译连接 不过得先设置一下
你那个编译器的话 请这样定义
.stack
.data
.code
因为 你那是 win32汇编的编译器

半生缘 发表于 2013-3-4 21:20:14

青草 发表于 2013-3-4 20:31 static/image/common/back.gif
楼主你栈越界了看看你干了什么
stack segment
          dw 0, 0   这里定义了两个字4个字节


话说 你的那些 ss:00 00 00 00 00 数据哪里弄得??
我是查看的生成的.exe 程序的 二进制代码弄得
你这个是生成的什么扩展名文件 太不人性化了

螃蟹009 发表于 2013-3-4 23:29:28

青草 发表于 2013-3-4 20:31 static/image/common/back.gif
楼主你栈越界了看看你干了什么
stack segment
          dw 0, 0   这里定义了两个字4个字节


我修改了,改成定义8个字, 可是还是错误的啊!错误信息如下!C:\Users\Administrator\Tools\2.asmasm(13) : error A2004: symbol type conflict
C:\Users\Administrator\Tools\2.asm(17) : error A2004: symbol type conflict

半生缘 发表于 2013-3-5 10:29:06

都说了你要换编译器
不然 win32汇编 编译器 换定义方式 不信 你把下边这段代码放到 你的编译器里试试
.model small
.stack 200h
.data
        szMsg db 'Hello World!',13,10,'$'
       
.CODE
START:
        mov ax,@data
        mov ds,ax
        lea dx,szMsg
        mov ah,9
        int 21h
       
        ;暂停,任意键关闭
        mov ah,1
        int 21h
        mov ah,4ch   ;结束,可以修改al设置返回码
        int 21h
END START
页: [1]
查看完整版本: 汇编新手求助