鱼C论坛

 找回密码
 立即注册
查看: 1848|回复: 7

请帮我鉴定我的一个汇编思路

[复制链接]
发表于 2013-2-16 17:15:01 | 显示全部楼层 |阅读模式
1鱼币
本帖最后由 遒羽 于 2013-2-16 22:00 编辑
  1. assume cs:code

  2. stack segment
  3. db 16 dup(0)
  4.         stack ends
  5. code segment
  6.         mov ax,4c00h
  7.         int 21h

  8. start:
  9.         mov ax,stack
  10.         mov ss,ax
  11.         mov sp,16
  12.         mov ax,0
  13.         push cx
  14.         push ax
  15.         mov bx,0
  16.         retf
  17. code ends
  18. end start
复制代码
本代码实现retf指令执行后,cs:ip指向代码段的第一条指令。
我的思路如下:将ss与stack联系起来,将16值移位给sp,这时候(IP)=(SS)*16+(SP)=0,
                 MOV   AX,0即相当于Mov ax,ip .是不是这样子说法???
                    谢谢!!

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-2-16 18:49:13 | 显示全部楼层
鄙人才疏学浅
有点看不懂阁下代码
在鄙人理解阁下在code segment开始就执行退出程序,既没有call也没有jmp所以鄙人是在不知道阁下start之下的代码是如何执行.
其次 鄙人是在不懂 IP 是如何和栈地址联系起来的 。从本质上说栈地址是20位,IP是16位的偏移地址。鄙人思路过于保守,实在是不懂阁下是如何联系的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-2-16 20:33:33 | 显示全部楼层
    这个汇编程序,我自己编译运行了一次,结果是不行的。
    问题出在18行的语句 retf,retf 相当于“pop ip,pop cs”
    15,16行入栈的两个数据中 push cx,此时cx的值26H(程序在这之前,没有对cx进行操作,cx默认存放程序的长度),ax的值0,进行到18行的时候,pop ip,ip此时的值为0,pop cx,cs的值为26h
    显然,cs:ip此时为 26:0,指向一段未知的内存空间,程序出错了,不能正常结束!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-2-16 20:44:43 | 显示全部楼层
本帖最后由 L]V[G 于 2013-2-16 20:47 编辑

再给我认为正确的两个程序:

第一个:
assume cs:code

stack segment
db 16 dup(0)
        stack ends
code segment
        mov ax,4c00h  ;标记处,执行完ret之后跳到该语句
        int 21h

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

        push ax

        mov bx,0

        ret   ;这句相当于 pop ip,执行后ip的值为0,程序跳到标记处
code ends
end start



第二个:
assume cs:code

stack segment
db 16 dup(0)
        stack ends
code segment
        mov ax,4c00h  ;标记处,执行完retf之后跳到该语句
        int 21h

start:
        mov ax,stack
        mov ss,ax
        mov sp,16
               
        mov cx,cs
        mov ax,0
               
        push cx
        push ax
        mov bx,0

        retf     ;相当于 pop ip,pop cs,执行完后 cs:ip指向标记处
code ends
end start


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-2-16 20:57:00 | 显示全部楼层
汇编语言 我需要学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-2-16 22:03:59 | 显示全部楼层
L]V[G 发表于 2013-2-16 20:44
再给我认为正确的两个程序:

第一个:

讲的很周到,我的疑问是:既然执行retf后cs:ip指向第一条指令,说明ip=0,对不对??既然这样,ip=0是不是和ax=0联系起来???谢谢!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-2-16 22:36:39 | 显示全部楼层
遒羽 发表于 2013-2-16 22:03
讲的很周到,我的疑问是:既然执行retf后cs:ip指向第一条指令,说明ip=0,对不对??既然这样,ip=0是不是 ...

push ax,把ax入栈,此时 ax的值为0,然后retf ( pop ip,pop cs),把0这个值赋给 ip,你这样应该理解,当然你的想法是正确的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-2-16 23:31:24 | 显示全部楼层
我 是菜鸟 尤其对汇编 所以 貌似看不懂 你的代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-5-12 06:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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