汇编新手求助
我是对着书写的啊!怎么还是有错误!!求教哪里错误??assume cs:code, ds:data, ss:stackdata 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
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 虽然你 栈只定义了 两个字 但是他空出来 八个字 半生缘 发表于 2013-3-4 20:04 static/image/common/back.gif
没问题啊 可以运行 不过我纳闷个问题你这个 栈段 定义的 看着这别扭呢
我没学好 也不知道他指到哪里去了 ...
我用的RADASM,可是就是说变异错误!我是对着书上的代码写的啊!! 本帖最后由 青草 于 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:04 static/image/common/back.gif
没问题啊 可以运行 不过我纳闷个问题你这个 栈段 定义的 看着这别扭呢
我没学好 也不知道他指到哪里去了 ...
:funk:问题就在他的栈定义小了 保险起见 最小要定义16个字节只定义2个字节或4个字节的话基本95%会出现问题很容易出现栈溢出或栈越界 话说没问题 栈定义小了不要紧 至少 他生成时 不知道为啥 他会空出那一行 正好16个字节
可能主要原因是 你应该换个编译器 换成 鱼c 的 masm6.15 吧
我用的就是他 不过我加了个visualassembly 忘了那下载的了 不用去dos 就可以编译连接 不过得先设置一下
你那个编译器的话 请这样定义
.stack
.data
.code
因为 你那是 win32汇编的编译器
青草 发表于 2013-3-4 20:31 static/image/common/back.gif
楼主你栈越界了看看你干了什么
stack segment
dw 0, 0 这里定义了两个字4个字节
话说 你的那些 ss:00 00 00 00 00 数据哪里弄得??
我是查看的生成的.exe 程序的 二进制代码弄得
你这个是生成的什么扩展名文件 太不人性化了 青草 发表于 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 都说了你要换编译器
不然 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]