能力值:
( LV12,RANK:450 )
|
-
-
2 楼
这些代码要在dos环境下才能正确运行,你在什么环境下运行的?
push ds
ds 是数据段,这句的意思保护数据段
dos环境下的段和现在32位环境下的段的概念完全不同。所以在dos环境下多见 push ds, push cs 等的保护段地址的动作,在32位环境下一般没有相应的做法。
sub ax,ax
或
xor ax,ax
这是将ax寄存器清零,下面的语句多数是利用ax=0来对其他寄存器或内存中的数据进行初始化。
|
能力值:
( LV8,RANK:130 )
|
-
-
3 楼
现纠正一下:
prognam segment
main proc far
assume cs:prognam
start:
push ds
sub ax,ax
push ax
mov ch,4
mov bx,220
rotate:
mov cl,4
rol bx,cl
mov al,bl
and al,0fh
add al,30h
cmp al,3ah
jl printit
add al,7h
printit:
mov dl,al
mov ah,2
int 21h
dec ch
jnz rotate
retf
main endp
prognam ends
end
纠正1:mov bx,220要放在循环外面,否则输出错误结果:0000
纠正2:最后的ret要改成retf
解释:
push ds
sub ax,ax
push ax
是与后面的retf配合用的
因为:
push ds
sub ax,ax
push ax
retf
会转到ds:0去继续执行
而DOS程序加载以后的ds:0是:
int 20
作用是程序结束退出
|
能力值:
( LV8,RANK:130 )
|
-
-
4 楼
都是强淫啊
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
谢谢楼上的几位兄弟, 问题已经搞定了. 不过ret可以用, ret和retf有什么区别啊?还有
mov ax, 4c00h
int 21h
也可以返回.是不是ret和retf没有带返回值呢?
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
ret和retf都是栈中转移指令,ret修改了IP的内容,retf修改了CS和IP的内容。
ret是近转移指令,retf是远转移指令。
可以用debug跟踪查看,用u命令查看的时候,CPU执行指令,ret相当于pop IP。而retf相当于pop IP;pop CS
在程序执行时,ret和retf是不会带返回值的。
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
为什么用u命令调试的时候, 到了retf后面还总是有无数的指令?
|
|
|