遒羽 发表于 2013-2-16 17:15:01

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

本帖最后由 遒羽 于 2013-2-16 22:00 编辑

assume cs:code

stack segment
db 16 dup(0)
      stack ends
code segment
      mov ax,4c00h
      int 21h

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

HelloWorld123 发表于 2013-2-16 18:49:13

鄙人才疏学浅
有点看不懂阁下代码
在鄙人理解阁下在code segment开始就执行退出程序,既没有call也没有jmp所以鄙人是在不知道阁下start之下的代码是如何执行.
其次 鄙人是在不懂 IP 是如何和栈地址联系起来的 。从本质上说栈地址是20位,IP是16位的偏移地址。鄙人思路过于保守,实在是不懂阁下是如何联系的

L]V[G 发表于 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,指向一段未知的内存空间,程序出错了,不能正常结束!!!

L]V[G 发表于 2013-2-16 20:44:43

本帖最后由 L]V

L]V static/image/common/back.gif
这个汇编程序,我自己编译运行了一次,结果是不行的。
    问题出在18行的语句 retf,retf 相当于“po ...
再给我认为正确的两个程序:

第一个:
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


bafengao 发表于 2013-2-16 20:57:00

汇编语言 我需要学习

遒羽 发表于 2013-2-16 22:03:59

L]V static/image/common/back.gif
再给我认为正确的两个程序:

第一个:


讲的很周到,我的疑问是:既然执行retf后cs:ip指向第一条指令,说明ip=0,对不对??既然这样,ip=0是不是和ax=0联系起来???谢谢!!!

L]V[G 发表于 2013-2-16 22:36:39

遒羽 发表于 2013-2-16 22:03 static/image/common/back.gif
讲的很周到,我的疑问是:既然执行retf后cs:ip指向第一条指令,说明ip=0,对不对??既然这样,ip=0是不是 ...

push ax,把ax入栈,此时 ax的值为0,然后retf ( pop ip,pop cs),把0这个值赋给 ip,你这样应该理解,当然你的想法是正确的

牡丹花下死做鬼 发表于 2013-2-16 23:31:24

我 是菜鸟 尤其对汇编 所以 貌似看不懂 你的代码
页: [1]
查看完整版本: 请帮我鉴定我的一个汇编思路