人造人 发表于 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
查看完整版本: 王爽汇编问题