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

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

2006-2-25 22:04
5678
;把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
这几行代码. 希望高手指点.刚学汇编. 好多东西不懂.

[培训]内核驱动高级班,冲击BAT一流互联网大厂工 作,每周日13:00-18:00直播授课

收藏
点赞7
打赏
分享
最新回复 (7)
雪    币: 238
活跃值: (326)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
gzgzlxg 11 2006-2-28 01:15
2
0
这些代码要在dos环境下才能正确运行,你在什么环境下运行的?
push ds
ds 是数据段,这句的意思保护数据段
dos环境下的段和现在32位环境下的段的概念完全不同。所以在dos环境下多见 push ds, push cs 等的保护段地址的动作,在32位环境下一般没有相应的做法。
sub ax,ax

xor ax,ax
这是将ax寄存器清零,下面的语句多数是利用ax=0来对其他寄存器或内存中的数据进行初始化。
雪    币: 254
活跃值: (126)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
heXer 3 2006-2-28 09:52
3
0
现纠正一下:
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
作用是程序结束退出
雪    币: 233
活跃值: (130)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
南蛮妈妈 3 2006-2-28 09:57
4
0
都是强淫啊
雪    币: 117
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
无奈无赖 2006-2-28 10:25
5
0
最初由 南蛮妈妈 发布
都是强淫啊


雪    币: 194
活跃值: (71)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
fangxin 2006-2-28 10:42
6
0
谢谢楼上的几位兄弟, 问题已经搞定了.  不过ret可以用, ret和retf有什么区别啊?还有
mov ax, 4c00h
int 21h
也可以返回.是不是ret和retf没有带返回值呢?
雪    币: 207
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Kven 2006-2-28 15:27
7
0
ret和retf都是栈中转移指令,ret修改了IP的内容,retf修改了CS和IP的内容。
ret是近转移指令,retf是远转移指令。
可以用debug跟踪查看,用u命令查看的时候,CPU执行指令,ret相当于pop IP。而retf相当于pop IP;pop CS

在程序执行时,ret和retf是不会带返回值的。
雪    币: 194
活跃值: (71)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
fangxin 2006-3-1 12:21
8
0
为什么用u命令调试的时候, 到了retf后面还总是有无数的指令?
游客
登录 | 注册 方可回帖
返回