首页
社区
课程
招聘
int 21h输出为什么看不到?
发表于: 2006-2-25 22:04 6153

int 21h输出为什么看不到?

2006-2-25 22:04
6153

;把BX(220)的内容以十六进制输出
prognam segment
main proc far
        assume cs:prognam
start:
        push ds
        sub ax,ax
        push ax
        mov ch,4
rotate:
        mov cl,4
        mov bx,220
        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
        ret
main endp
prognam ends
end

上面是代码, 运行什么也不输出.为什么?

还是为什么每个程序都要
        push ds
        sub ax,ax
        push ax
这几行代码. 希望高手指点.刚学汇编. 好多东西不懂.


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 7
支持
分享
最新回复 (7)
雪    币: 238
活跃值: (326)
能力值: ( 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来对其他寄存器或内存中的数据进行初始化。
2006-2-28 01:15
0
雪    币: 254
活跃值: (126)
能力值: ( 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
作用是程序结束退出
2006-2-28 09:52
0
雪    币: 233
活跃值: (130)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
4
都是强淫啊
2006-2-28 09:57
0
雪    币: 117
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
最初由 南蛮妈妈 发布
都是强淫啊


2006-2-28 10:25
0
雪    币: 194
活跃值: (71)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
谢谢楼上的几位兄弟, 问题已经搞定了.  不过ret可以用, ret和retf有什么区别啊?还有
mov ax, 4c00h
int 21h
也可以返回.是不是ret和retf没有带返回值呢?
2006-2-28 10:42
0
雪    币: 207
活跃值: (40)
能力值: ( 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是不会带返回值的。
2006-2-28 15:27
0
雪    币: 194
活跃值: (71)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
为什么用u命令调试的时候, 到了retf后面还总是有无数的指令?
2006-3-1 12:21
0
游客
登录 | 注册 方可回帖
返回
//