新人求助,关于驻留程序的小问题
汇编吧
全部回复
仅看楼主
level 4
caiyang12yang 楼主
一楼放第一张测试图
运行环境:虚拟机32位xp下的cmd
编译工具:masm
调试方式:debug
2014年06月11日 22点06分 1
level 4
caiyang12yang 楼主
二楼贴出代码
stack segment para stack 'stack'
dw 100 dup ( 0 )
stack ends
code segment
assume ds:code,cs:code,ss:stack
time db 0, 0
count db 0
correct db 0 ;代码段和数据段写在一起,方便调用
int_start: ;驻留程序入口
push ax
push bx
push cx
push dx
cmp count,18 ;利用1ch中断实现每秒输出一个字符
jne exit
mov count,0
cmp time[0],-8 ;测试time[0]的值
jne exit
mov ah,0eh ;输出time[0]对应的数字(根据初始化应该是0才对)
mov al,time[0]
add al,48
mov bl,0
int 10h
exit:
inc count
pop dx
pop cx
pop bx
pop ax
iret ;驻留程序返回
start:
mov ax,code
mov ds,ax ;数据初始化
mov sp,200 ;堆栈指针初始化
mov dx,offset int_start
mov ax,0251ch
int 21h ;设置中断向量
mov dx,start-int_start
mov cl,4
shr dx,cl
add dx,11h
mov ah,31h
int 21h ;驻留退出
code ends
end start
2014年06月11日 22点06分 2
level 4
caiyang12yang 楼主
如上图所示,运行结果输出的是每秒一个左括号,对应ascii码为40?!
证明time[0]的值成了-8
cmp time[0],-8一句也证明了time[0]确实被当成了-8
可是根据debug显示
ds和cs都是17c8h
且17c8:0000~0003都是0(如图所示),反汇编显示的代码中
time[0]也是[0000],即ds:0000,也就是cs:0000,事实上把time[0]改成
byte ptr cs:0 的话,运行结果是没有问题的
请大神们帮忙解答,time[0]的值为什么会变成-8,即17c8:0018的F8(我猜测的)
O(∩_∩)O谢谢
2014年06月11日 22点06分 4
level 9
好复杂啊
2014年06月11日 23点06分 5
level 4
caiyang12yang 楼主
也没很复杂啊,不知道time[0]为什么会发生偏移
2014年06月11日 23点06分 6
原来你是程序猿啊
2014年12月02日 01点12分
level 2
汇编语言怎么翻译成 c语言 大神知道吗?谢谢
2014年06月12日 00点06分 7
只能根据意思重新写吧,不过c语言可以反汇编
2014年06月12日 01点06分
1