请帮我鉴定我的一个汇编思路
本帖最后由 遒羽 于 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 .是不是这样子说法???
谢谢!!
鄙人才疏学浅
有点看不懂阁下代码
在鄙人理解阁下在code segment开始就执行退出程序,既没有call也没有jmp所以鄙人是在不知道阁下start之下的代码是如何执行.
其次 鄙人是在不懂 IP 是如何和栈地址联系起来的 。从本质上说栈地址是20位,IP是16位的偏移地址。鄙人思路过于保守,实在是不懂阁下是如何联系的 这个汇编程序,我自己编译运行了一次,结果是不行的。
问题出在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
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
汇编语言 我需要学习 L]V static/image/common/back.gif
再给我认为正确的两个程序:
第一个:
讲的很周到,我的疑问是:既然执行retf后cs:ip指向第一条指令,说明ip=0,对不对??既然这样,ip=0是不是和ax=0联系起来???谢谢!!! 遒羽 发表于 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,你这样应该理解,当然你的想法是正确的 我 是菜鸟 尤其对汇编 所以 貌似看不懂 你的代码
页:
[1]