首页
社区
课程
招聘
汇编语言 王爽,某题目疑问
发表于: 2011-1-4 23:56 4015

汇编语言 王爽,某题目疑问

2011-1-4 23:56
4015

assume cs:code,ds:data,ss:stack
data segment
 dw 0123h,0234h,0345h,0456h,0567h,0678h,0789h,0888h
data ends
stack segment
dw 0,0,0,0,0,0,0,0
stack ends
code segment
start:
   mov ax,stack
   mov ss,ax
   mov sp,16
   mov ax,data
   mov ds,ax
   mov bx,0
   mov cx,8
lp1:
    push ds:[bx] ;这个程序有问题
    add bx,2
    loop lp1
mov bx,0
 mov cx,8
lp2:
    pop ds:[bx]
    add bx,2
    loop lp2



mov ax,4c00h
int 21h
code ends

end start


这个程序汇编后,用debug名字执行,会看出有问题。
DS=0BD3  ES=0BC3  SS=0BD4  CS=0BD5  IP=0015   NV UP EI PL NZ NA PO NC
0BD5:0015 83C302        ADD     BX,+02
-t

AX=0BD3  BX=000A  CX=0004  DX=0000  SP=0006  BP=0000  SI=0000  DI=0000
DS=0BD3  ES=0BC3  SS=0BD4  CS=0BD5  IP=0018   NV UP EI PL NZ NA PE NC
0BD5:0018 E2F9          LOOP    0013
-t

AX=0BD3  BX=000A  CX=0003  DX=0000  SP=0006  BP=0000  SI=0000  DI=0000
DS=0BD3  ES=0BC3  SS=0BD4  CS=0BD5  IP=0013   NV UP EI PL NZ NA PE NC
0BD5:0013 FF37          PUSH    [BX]                               DS:000A=0678
-t

AX=0BD3  BX=000A  CX=0003  DX=0000  SP=0004  BP=0000  SI=0000  DI=0000
DS=0BD3  ES=0BC3  SS=0BD4  CS=0BD5  IP=0015   NV UP EI PL NZ NA PE NC
0BD5:0015 83C302        ADD     BX,+02
-t

AX=0BD3  BX=000A  CX=0003  DX=0000  SP=0004  BP=0000  SI=0000  DI=0000
DS=0BD3  ES=0BC3  SS=0BD4  CS=00B4  IP=0017   NV UP DI PL NZ NA PE CY
00B4:0017 0000          ADD     [BX+SI],AL                         DS:000A=4B

还在循环次数中的时候,最后两步,CS的值为什么会变了?造成程序运行错误?
我是哪儿有问题?怎么检查不出来?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
这个是X86的汇编啊?
2011-1-5 00:04
0
雪    币: 83
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
这个问题我以前也遇到过,
问题在于这一句
mov sp,16
如果随意改变了栈顶的值,以后只要进行堆栈的操作比如push 或者pop都会出错,然后后面的指令就全乱了。
2011-1-5 00:15
0
雪    币: 83
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
8086你可能不会调试
把这个win32汇编程序编译一下,用od调试,然后你就全明白了
                .386
                .model flat,stdcall
                option casemap:none
include                windows.inc
include                kernel32.inc
includelib        kernel32.lib
.code
start:
                mov eax,2000h
                mov esp,10h
                push eax
                mov eax,3366h
                push eax
                invoke        ExitProcess,NULL
                end        start
2011-1-5 00:21
0
雪    币: 83
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
http://www.asmedu.net/blog/user/postcontent.jsp?neighborId=5117&kindLevel=1&kindId=4055&postId=3558&readSg=1
这个是我3年前的帖子,现在那个论坛账号都忘了,最后还是我自己回答的,
反正是引起了异常,然后后面就不会分析了
2011-1-5 00:28
0
雪    币: 421
活跃值: (60)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
我也自己回答自己的问题。
mov sp,16 这句应该为16h
真是郁闷。
还是自己不懂。
谢谢那位热心的朋友。

dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h  ; 占用了16位
  dw 0,0,0,0,0   ;5个字占20位
2011-1-5 10:11
0
雪    币: 83
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
mov ss,ax
mov sp,16
mov ax,data
执行mov ss,ax后下一条指令就是mov ax,data了,mov sp,16被偷偷执行掉了
书上说学到后面就会明白,我后来都没去想那个问题了,OD里是没这种事,谁能否解释一下
2011-1-5 14:38
0
游客
登录 | 注册 方可回帖
返回
//