鱼C论坛

 找回密码
 立即注册
楼主: wyuri

王爽汇编问题

[复制链接]
发表于 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:[1 * 4]
        pop word ptr [original_int3_address]
        push es:[1 * 4 + 2]
        pop word ptr [original_int3_address + 2]
        
        
        cli
        mov ax, int3_server
        push ax
        pop es:[1 * 4]
        push cs
        pop es:[1 * 4 + 2]
        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 [bp - 2]
        call far ptr show_hex
        add sp, 2
        
        ;输出空格
        mov ah, 0eh
        mov al, ' '
        int 10h
        
        push [bp - 4]
        call far ptr show_hex
        add sp, 2
        
        mov ah, 0eh
        mov al, ' '
        int 10h
        
        push [bp - 6]
        call far ptr show_hex
        add sp, 2
        
        mov ah, 0eh
        mov al, ' '
        int 10h
        
        push [bp - 8]
        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 [debug_code_address], ax
        mov ax, debug_it_code
        mov word ptr [debug_code_address + 2], ax
        
        ;设置tf 和 if
        pushf
        pop ax
        or ah, 00000011b
        push ax
        popf
        
        push word ptr [debug_code_address + 2]
        push word ptr [debug_code_address]
        
        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
[code]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, [bp + 6] ;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
[/code]

show_hex.asm



ml show_hex.asm /c
ml test.asm show_hex.obj
cls
test.exe

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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, [bp + 6] ;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:[1 * 4]
        pop word ptr [original_int3_address]
        push es:[1 * 4 + 2]
        pop word ptr [original_int3_address + 2]
        
        
        cli
        mov ax, int3_server
        push ax
        pop es:[1 * 4]
        push cs
        pop es:[1 * 4 + 2]
        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 [bp - 2]
        call far ptr show_hex
        add sp, 2
        
        ;输出空格
        mov ah, 0eh
        mov al, ' '
        int 10h
        
        push [bp - 4]
        call far ptr show_hex
        add sp, 2
        
        mov ah, 0eh
        mov al, ' '
        int 10h
        
        push [bp - 6]
        call far ptr show_hex
        add sp, 2
        
        mov ah, 0eh
        mov al, ' '
        int 10h
        
        push [bp - 8]
        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 [debug_code_address], ax
        mov ax, debug_it_code
        mov word ptr [debug_code_address + 2], ax
        
        ;设置tf 和 if
        pushf
        pop ax
        or ah, 00000011b
        push ax
        popf
        
        push word ptr [debug_code_address + 2]
        push word ptr [debug_code_address]
        
        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, '


[code]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
[/code]




想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-11 14:38:54 | 显示全部楼层
无语了,怎么还是这样?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-11 14:42:26 | 显示全部楼层
ml show_hex.asm /c
ml test.asm show_hex.obj
cls
test.exe

test_asm__show_hex_asm.zip (1.5 KB, 下载次数: 1)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-13 15:26:29 | 显示全部楼层
人造人 发表于 2017-4-11 14:29
我花了点时间写了一个debug程序^_^
实现了debug程序的核心功能
你看看能不能看懂

I'm very very very thankyou
我非常非常非常感谢,能耗时间管我这个菜鸟,我真的真的真的非常感谢,谢谢。
不过我看了一下程序,我理解的就是下面图片显示的,我尝试着去理解,但还是不太清楚,程序在说明什么,他与我问的问题很密切相关么
问题22.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-13 15:54:57 | 显示全部楼层
wyuri 发表于 2017-4-13 15:26
I'm very very very thankyou
我非常非常非常感谢,能耗时间管我这个菜鸟,我真的真的真的非常感谢,谢 ...

无标题.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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的例子
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-13 16:18:59 | 显示全部楼层
一个程序(test.exe)正在执行,突然来了一个中断,一般情况下,处理器响应中断,那么处理器需要保存当前工作状态,转去执行中断服务程序,那么处理器是如何保存当前的工作状态的?保存在哪里?执行完中断服务程序后,为什么能继续执行之前的那个(test.exe)程序?在中断服务程序中堆栈中有些什么?为什么还可以像这样调用int 9中断例程?
无标题.png

中断例程执行,需要什么环境?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-13 16:20:22 | 显示全部楼层
这一切需要从正在执行的那个test.exe程序说起
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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

无标题.png
无标题1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-13 20:00:30 | 显示全部楼层
人造人 发表于 2017-4-13 16:18
一个程序(test.exe)正在执行,突然来了一个中断,一般情况下,处理器响应中断,那么处理器需要保存当前工 ...

您没明白我的意思,这样吧,我现在发不了图了,我明天发图,好好组织一下我的疑惑,您能仔细看完么?因为这两天的我的问题,和您给的答案有点对不上^_^   ̄▽ ̄
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-13 20:07:51 | 显示全部楼层
人造人 发表于 2017-4-13 16:35
假设 test.exe 程序中有这些

对,我的意思就是要设置if和tf等于0,而程序的后面课后题说,if和tf不用设置了。我一直都是在问你这个问题,为什么不用设置了。
大哥我只求你一件事,如果您忙的话你可以不用理我,如果想帮我这个菜鸟解惑,麻烦您把下面我发的图片内容仔细看完好么,这两天由于我语言组织能力问题,说不清楚导致您帮我解惑的问题都是答非所问,因为我语言组织能力的问题所以我问的大家都不明白什么意思,没人理我,就您总告诉,真的真的真的超级感谢。我从新组织一下我的疑惑。 好么,拜托了。真心感谢谢谢^_^
问题23.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-13 20:10:28 | 显示全部楼层
wyuri 发表于 2017-4-13 20:07
对,我的意思就是要设置if和tf等于0,而程序的后面课后题说,if和tf不用设置了。我一直都是在问你这个问 ...

拜托各位,看完这个图片说的内容好不好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-13 20:41:54 | 显示全部楼层
wyuri 发表于 2017-4-13 20:07
对,我的意思就是要设置if和tf等于0,而程序的后面课后题说,if和tf不用设置了。我一直都是在问你这个问 ...

tf 和 if 不是中断例程设置的
是在进入中断例程之前,硬件设置的(应该是cpu设置的)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-18 09:30:45 | 显示全部楼层
人造人 发表于 2017-4-13 20:41
tf 和 if 不是中断例程设置的
是在进入中断例程之前,硬件设置的(应该是cpu设置的)

那寄存器的push 和pop 的顺序呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-18 09:39:00 | 显示全部楼层
人造人 发表于 2017-4-13 20:41
tf 和 if 不是中断例程设置的
是在进入中断例程之前,硬件设置的(应该是cpu设置的)

那这个怎么解释啊
问题24.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-18 12:20:50 | 显示全部楼层
wyuri 发表于 2017-4-18 09:30
那寄存器的push 和pop 的顺序呢

在int 9 内部使用 iret 返回了呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-18 12:23:41 | 显示全部楼层
wyuri 发表于 2017-4-18 09:30
那寄存器的push 和pop 的顺序呢

push 和 pop 的顺序没有问题呀
建议你重新看看第12章
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-18 12:29:34 | 显示全部楼层
wyuri 发表于 2017-4-18 09:39
那这个怎么解释啊

int 指令相当于一个特殊的 call 指令
call指令 call的是一个内存地址
int指令 call的是中断向量表中指向的一个过程
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-6 13:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表