鱼C论坛

 找回密码
 立即注册
查看: 1856|回复: 8

汇编新手求助

[复制链接]
发表于 2013-3-4 19:49:00 | 显示全部楼层 |阅读模式

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

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

x
我是对着书写的啊!怎么还是有错误!!求教哪里错误??
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:[0]
    push ds:[2]
    pop ds:[2]
    pop ds:[0]

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 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:[0]
    push ds:[2]
    pop ds:[2]
    pop ds:[0]
    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 虽然你 栈只定义了 两个字 但是他空出来 八个字
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2013-3-4 20:18:41 | 显示全部楼层

我用的RADASM,可是就是说变异错误!我是对着书上的代码写的啊!!
捕获.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 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:00  00 00 00 00 52 a5 f1 00 33 00  fa  00  cd  00 34
ss:10  3f d3 a6  ..........  
           |
          SP
红色你定义的栈的大小
蓝色为你指定SP后所超出的数据
加粗带下划线的数据就是你第一次push压栈后要覆盖的数据,加粗睡觉的数据是你第二次压栈要覆盖的数据

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

反正问题就出现在你栈里

一看就是栈没有好好学  

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



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-3-4 20:48:40 | 显示全部楼层
半生缘 发表于 2013-3-4 20:04
没问题啊 可以运行 不过我纳闷个问题  你这个 栈段 定义的 看着这别扭呢
我没学好 也不知道他指到哪里去了 ...

:funk:  问题就在他的栈定义小了 保险起见 最小要定义16个字节  只定义2个字节或4个字节的话基本95%会出现问题  很容易出现栈溢出或栈越界
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-3-4 21:14:24 | 显示全部楼层
话说没问题 栈定义小了不要紧 至少 他生成时 不知道为啥 他会空出那一行 正好16个字节
可能主要原因是 你应该换个编译器 换成 鱼c 的 masm6.15 吧
我用的就是他 不过我加了个visualassembly 忘了那下载的了 不用去dos 就可以编译连接 不过得先设置一下
你那个编译器的话 请这样定义
.stack
.data
.code
因为 你那是 win32汇编的编译器
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-3-4 21:20:14 | 显示全部楼层
青草 发表于 2013-3-4 20:31
楼主你栈越界了  看看你干了什么
stack segment
          dw 0, 0   这里定义了两个字  4个字节

话说 你的那些 ss:00 00 00 00 00 数据哪里弄得??
我是查看的生成的.exe 程序的 二进制代码弄得
你这个是生成的什么扩展名文件 太不人性化了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2013-3-4 23:29:28 | 显示全部楼层
青草 发表于 2013-3-4 20:31
楼主你栈越界了  看看你干了什么
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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-18 00:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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