人造人
发表于 2017-4-11 14:29:47
wyuri 发表于 2017-4-11 12:27
你的意思是说只要我按键盘上的按键就产生中断了,然后就设置iftf为0 了是么?
书上是这样写的第十五章: ...
我花了点时间写了一个debug程序^_^
实现了debug程序的核心功能
你看看能不能看懂
test.asm
assume cs:code, ds:data, ss:stack
extrn show_hex:far
stack segment
db 100 dup(?)
stack ends
data segment
debug_code_address dd 0
original_int3_address dd 0
int3_server_run db "int3_server_run!", 0dh, 0ah, "$"
data ends
code segment
;安装int3中断服务程序
init:
push es
mov ax, 0
mov es, ax
push es:
pop word ptr
push es:
pop word ptr
cli
mov ax, int3_server
push ax
pop es:
push cs
pop es:
sti
pop es
ret
int3_server:
push bp
mov bp, sp
push ax
push bx
push cx
push dx
push ds
mov ax, data
mov ds, ax
mov ah, 9
mov dx, offset int3_server_run
int 21h
;********************************************************************
;显示寄存器
push
call far ptr show_hex
add sp, 2
;输出空格
mov ah, 0eh
mov al, ' '
int 10h
push
call far ptr show_hex
add sp, 2
mov ah, 0eh
mov al, ' '
int 10h
push
call far ptr show_hex
add sp, 2
mov ah, 0eh
mov al, ' '
int 10h
push
call far ptr show_hex
add sp, 2
mov ah, 0eh
mov al, 0dh
int 10h
mov ah, 0eh
mov al, 0ah
int 10h
;*************************************************************************
pop ds
pop dx
pop cx
pop bx
pop ax
mov sp, bp
pop bp
iret ;返回到被中断程序的下一条指令
start:
mov ax, stack
mov ss, ax
mov sp, 100
mov ax, data
mov ds, ax
call init; 安装中断向量
mov ax, debug_it_start
mov word ptr , ax
mov ax, debug_it_code
mov word ptr , ax
;设置tf 和 if
pushf
pop ax
or ah, 00000011b
push ax
popf
push word ptr
push word ptr
iret ;返回到调试程序,在这里返回到 debug_it_start,也就是 mov ax, debug_it_stack 这条指令
mov ax,4c00h
int 21h
code ends
;********************** 被调试程序 ***********************************************
debug_it_data segment
string db "debuging!", 0dh, 0ah, '
show_hex.asm
assume cs:code
public show_hex
code segment
;子程序需要远调用 call far ptr show_hex
;显示十六进制数到屏幕
;void show_hex(word data);
show_hex:
push bp
mov bp, sp
;sub sp, 10h
push ax
push bx
push cx
push dx
mov ax, ;mov ax, data
mov cx, 4
show_hex_s:
mov bx, ax
and bx, 0f000h
push cx
mov cl, 12
shr bx, cl
pop cx
cmp bx, 0ah
jl show_hex_less_a
sub bx, 0ah
add bx, 'A'
jmp show_hex_less_n
show_hex_less_a:
add bx, '0'
show_hex_less_n:
push ax
;输出bl中的字符
mov ah, 0eh
mov al, bl
int 10h
pop ax
push cx
mov cl, 4
shl ax, cl
pop cx
loop show_hex_s
pop dx
pop cx
pop bx
pop ax
mov sp, bp
pop bp
retf ;远调用返回
code ends
end
ml show_hex.asm /c
ml test.asm show_hex.obj
cls
test.exe
D:\Masm615>test.exe
int3_server_run!
3302 0000 00FF 0588
int3_server_run!
3302 0000 00FF 0588
int3_server_run!
3302 0000 00FF 0588
int3_server_run!
05AF 0000 00FF 0588
int3_server_run!
05AF 0000 00FF 0588
int3_server_run!
05AE 0000 00FF 0588
int3_server_run!
05AE 0000 00FF 0588
int3_server_run!
09AE 0000 00FF 0588
int3_server_run!
09AE 0000 00FF 0000
debuging!
int3_server_run!
4C00 0000 00FF 0000
D:\Masm615>
debug_it_data ends
debug_it_stack segment
db 100 dup(?)
debug_it_stack ends
;只是显示一句话
debug_it_code segment
debug_it_start:
mov ax, debug_it_stack
mov ss, ax
mov sp, 100
mov ax, debug_it_data
mov ds, ax
mov ah, 9
mov dx, offset string
int 21h
mov ax, 4c00h
int 21h
debug_it_code ends
end start
show_hex.asm
[ DISCUZ_CODE_1 ]
ml show_hex.asm /c
ml test.asm show_hex.obj
cls
test.exe
[ DISCUZ_CODE_2 ]
人造人
发表于 2017-4-11 14:37:22
人造人 发表于 2017-4-11 14:29
我花了点时间写了一个debug程序^_^
实现了debug程序的核心功能
你看看能不能看懂
上面怎么回事?
我重新发一下吧
show_hex.asm
assume cs:code
public show_hex
code segment
;子程序需要远调用 call far ptr show_hex
;显示十六进制数到屏幕
;void show_hex(word data);
show_hex:
push bp
mov bp, sp
;sub sp, 10h
push ax
push bx
push cx
push dx
mov ax, ;mov ax, data
mov cx, 4
show_hex_s:
mov bx, ax
and bx, 0f000h
push cx
mov cl, 12
shr bx, cl
pop cx
cmp bx, 0ah
jl show_hex_less_a
sub bx, 0ah
add bx, 'A'
jmp show_hex_less_n
show_hex_less_a:
add bx, '0'
show_hex_less_n:
push ax
;输出bl中的字符
mov ah, 0eh
mov al, bl
int 10h
pop ax
push cx
mov cl, 4
shl ax, cl
pop cx
loop show_hex_s
pop dx
pop cx
pop bx
pop ax
mov sp, bp
pop bp
retf ;远调用返回
code ends
end
test.asm
assume cs:code, ds:data, ss:stack
extrn show_hex:far
stack segment
db 100 dup(?)
stack ends
data segment
debug_code_address dd 0
original_int3_address dd 0
int3_server_run db "int3_server_run!", 0dh, 0ah, "$"
data ends
code segment
;安装int3中断服务程序
init:
push es
mov ax, 0
mov es, ax
push es:
pop word ptr
push es:
pop word ptr
cli
mov ax, int3_server
push ax
pop es:
push cs
pop es:
sti
pop es
ret
int3_server:
push bp
mov bp, sp
push ax
push bx
push cx
push dx
push ds
mov ax, data
mov ds, ax
mov ah, 9
mov dx, offset int3_server_run
int 21h
;********************************************************************
;显示寄存器
push
call far ptr show_hex
add sp, 2
;输出空格
mov ah, 0eh
mov al, ' '
int 10h
push
call far ptr show_hex
add sp, 2
mov ah, 0eh
mov al, ' '
int 10h
push
call far ptr show_hex
add sp, 2
mov ah, 0eh
mov al, ' '
int 10h
push
call far ptr show_hex
add sp, 2
mov ah, 0eh
mov al, 0dh
int 10h
mov ah, 0eh
mov al, 0ah
int 10h
;*************************************************************************
pop ds
pop dx
pop cx
pop bx
pop ax
mov sp, bp
pop bp
iret ;返回到被中断程序的下一条指令
start:
mov ax, stack
mov ss, ax
mov sp, 100
mov ax, data
mov ds, ax
call init; 安装中断向量
mov ax, debug_it_start
mov word ptr , ax
mov ax, debug_it_code
mov word ptr , ax
;设置tf 和 if
pushf
pop ax
or ah, 00000011b
push ax
popf
push word ptr
push word ptr
iret ;返回到调试程序,在这里返回到 debug_it_start,也就是 mov ax, debug_it_stack 这条指令
mov ax,4c00h
int 21h
code ends
;********************** 被调试程序 ***********************************************
debug_it_data segment
string db "debuging!", 0dh, 0ah, '
ml show_hex.asm /c
ml test.asm show_hex.obj
cls
test.exe
D:\Masm615>test.exe
int3_server_run!
3302 0000 00FF 0588
int3_server_run!
3302 0000 00FF 0588
int3_server_run!
3302 0000 00FF 0588
int3_server_run!
05AF 0000 00FF 0588
int3_server_run!
05AF 0000 00FF 0588
int3_server_run!
05AE 0000 00FF 0588
int3_server_run!
05AE 0000 00FF 0588
int3_server_run!
09AE 0000 00FF 0588
int3_server_run!
09AE 0000 00FF 0000
debuging!
int3_server_run!
4C00 0000 00FF 0000
D:\Masm615>
debug_it_data ends
debug_it_stack segment
db 100 dup(?)
debug_it_stack ends
;只是显示一句话
debug_it_code segment
debug_it_start:
mov ax, debug_it_stack
mov ss, ax
mov sp, 100
mov ax, debug_it_data
mov ds, ax
mov ah, 9
mov dx, offset string
int 21h
mov ax, 4c00h
int 21h
debug_it_code ends
end start
[ DISCUZ_CODE_2 ]
[ DISCUZ_CODE_3 ]
人造人
发表于 2017-4-11 14:38:54
无语了,怎么还是这样?
人造人
发表于 2017-4-11 14:42:26
ml show_hex.asm /c
ml test.asm show_hex.obj
cls
test.exe
人造人
发表于 2017-4-11 14:43:14
D:\Masm615>test.exe
int3_server_run!
3302 0000 00FF 0588
int3_server_run!
3302 0000 00FF 0588
int3_server_run!
3302 0000 00FF 0588
int3_server_run!
05AF 0000 00FF 0588
int3_server_run!
05AF 0000 00FF 0588
int3_server_run!
05AE 0000 00FF 0588
int3_server_run!
05AE 0000 00FF 0588
int3_server_run!
09AE 0000 00FF 0588
int3_server_run!
09AE 0000 00FF 0000
debuging!
int3_server_run!
4C00 0000 00FF 0000
D:\Masm615>
wyuri
发表于 2017-4-13 15:26:29
人造人 发表于 2017-4-11 14:29
我花了点时间写了一个debug程序^_^
实现了debug程序的核心功能
你看看能不能看懂
I'm very very very thankyou
我非常非常非常感谢,能耗时间管我这个菜鸟,我真的真的真的非常感谢,谢谢。
不过我看了一下程序,我理解的就是下面图片显示的,我尝试着去理解,但还是不太清楚,程序在说明什么,他与我问的问题很密切相关么
人造人
发表于 2017-4-13 15:54:57
wyuri 发表于 2017-4-13 15:26
I'm very very very thankyou
我非常非常非常感谢,能耗时间管我这个菜鸟,我真的真的真的非常感谢,谢 ...
人造人
发表于 2017-4-13 16:04:11
wyuri 发表于 2017-4-13 15:26
I'm very very very thankyou
我非常非常非常感谢,能耗时间管我这个菜鸟,我真的真的真的非常感谢,谢 ...
int 9中断例程 和 int 1 中断例程(单步中断例程) ,都是中断例程,有什么区别?
你不明白为什么可以那样调用int 9中断例程,我举了一个int 1的例子
人造人
发表于 2017-4-13 16:18:59
一个程序(test.exe)正在执行,突然来了一个中断,一般情况下,处理器响应中断,那么处理器需要保存当前工作状态,转去执行中断服务程序,那么处理器是如何保存当前的工作状态的?保存在哪里?执行完中断服务程序后,为什么能继续执行之前的那个(test.exe)程序?在中断服务程序中堆栈中有些什么?为什么还可以像这样调用int 9中断例程?
中断例程执行,需要什么环境?
人造人
发表于 2017-4-13 16:20:22
这一切需要从正在执行的那个test.exe程序说起
人造人
发表于 2017-4-13 16:35:20
假设 test.exe 程序中有这些
mov ax, stack
mov ss, ax
mov sp, 100
mov ax, data
mov ds, ax
处理器正在执行 mov ax, data,突然来了中断
那么处理器执行完mov ax, data 这条指令后响应中断,
1 从中断信息中 取得中断类型码
2 标志寄存器的值入栈 因为在中断过程
中要改变标志寄存器的值所以先将其保存在栈中
3 设置标志寄存器的第8位TF 和第9位IF的值为0
4 CS的内容入栈
5 IP的内容入栈
6 从内存地址为中断类型码*4 和中断类型码*4+2 的两个字单元中读取中断处理程序的入口地址设置IP和CS。
pushf
TF = 0, IF = 0
push CS
push IP
wyuri
发表于 2017-4-13 20:00:30
人造人 发表于 2017-4-13 16:18
一个程序(test.exe)正在执行,突然来了一个中断,一般情况下,处理器响应中断,那么处理器需要保存当前工 ...
您没明白我的意思,这样吧,我现在发不了图了,我明天发图,好好组织一下我的疑惑,您能仔细看完么?因为这两天的我的问题,和您给的答案有点对不上^_^ ̄▽ ̄
wyuri
发表于 2017-4-13 20:07:51
人造人 发表于 2017-4-13 16:35
假设 test.exe 程序中有这些
对,我的意思就是要设置if和tf等于0,而程序的后面课后题说,if和tf不用设置了。我一直都是在问你这个问题,为什么不用设置了。
大哥我只求你一件事,如果您忙的话你可以不用理我,如果想帮我这个菜鸟解惑,麻烦您把下面我发的图片内容仔细看完好么,这两天由于我语言组织能力问题,说不清楚导致您帮我解惑的问题都是答非所问,因为我语言组织能力的问题所以我问的大家都不明白什么意思,没人理我,就您总告诉,真的真的真的超级感谢。我从新组织一下我的疑惑。 好么,拜托了。真心感谢谢谢^_^
wyuri
发表于 2017-4-13 20:10:28
wyuri 发表于 2017-4-13 20:07
对,我的意思就是要设置if和tf等于0,而程序的后面课后题说,if和tf不用设置了。我一直都是在问你这个问 ...
拜托各位,看完这个图片说的内容好不好
人造人
发表于 2017-4-13 20:41:54
wyuri 发表于 2017-4-13 20:07
对,我的意思就是要设置if和tf等于0,而程序的后面课后题说,if和tf不用设置了。我一直都是在问你这个问 ...
tf 和 if 不是中断例程设置的
是在进入中断例程之前,硬件设置的(应该是cpu设置的)
wyuri
发表于 2017-4-18 09:30:45
人造人 发表于 2017-4-13 20:41
tf 和 if 不是中断例程设置的
是在进入中断例程之前,硬件设置的(应该是cpu设置的)
那寄存器的push 和pop 的顺序呢
wyuri
发表于 2017-4-18 09:39:00
人造人 发表于 2017-4-13 20:41
tf 和 if 不是中断例程设置的
是在进入中断例程之前,硬件设置的(应该是cpu设置的)
那这个怎么解释啊
人造人
发表于 2017-4-18 12:20:50
wyuri 发表于 2017-4-18 09:30
那寄存器的push 和pop 的顺序呢
在int 9 内部使用 iret 返回了呀
人造人
发表于 2017-4-18 12:23:41
wyuri 发表于 2017-4-18 09:30
那寄存器的push 和pop 的顺序呢
push 和 pop 的顺序没有问题呀
建议你重新看看第12章
人造人
发表于 2017-4-18 12:29:34
wyuri 发表于 2017-4-18 09:39
那这个怎么解释啊
int 指令相当于一个特殊的 call 指令
call指令 call的是一个内存地址
int指令 call的是中断向量表中指向的一个过程
页:
1
2
3
4
5
6
7
8
9
[10]
11