鱼C论坛

 找回密码
 立即注册
查看: 802|回复: 8

[已解决]修改0中断

[复制链接]
发表于 2023-8-30 15:22:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
assume cs:codesg,ds:data,ss:stact

data segment  ;数据段
        db "overflow!"

data ends

stact segment ;栈段

stact ends

codesg segment 
 start:     ;安装do0
            mov ax,cs 
            mov ds,ax 
            mov si,offset do0  ;设置ds:si指向源地址
            mov ax,0
            mov es,ax
            mov di,200h        ;设置es:di指向目的地址
            mov cx,offset do0end-offset do0  ;设置cx为传输长度=do0end的偏移地址-do0偏移地址
            cld                      ;设置传输方向为正
            rep movsb
            
                ;设置中断向量表
                mov ax,0
                mov es,ax
                mov word ptr es:[0],200h
                mov word ptr es:[2],0
                        
           
        mov ax,4C00H 
        int 21H 
                
        do0:                    ;显示字符串"overflow!"
                jmp short do0start 
                db "overflow!"     ;数据应该放在安全的空间
        do0start:
                mov ax,cs     ;[cs=0000h]
                mov ds,ax 
                mov si,202 ;设置ds:si指向字符串,jmp指令占用两个字节,字符串从202开始

                mov ax,0b800h 
                mov es,ax
                mov di,12*160+36* 2   ;设置es:di指向显存空间的中间位置
                mov cx,9              ;设置cx为字符串长度
          s:mov al,[si]
            mov es:[di],al 
                inc si
                add di,2
                loop s
                                
                mov ax,4c00h
                int 21h
 do0end:nop
           
           
codesg ends
end start
          




我的问题:
执行
        mov ax,1000h
                mov bh,1
                div bh
后,没有显示overflow! 而显示乱码  错在哪儿?




最佳答案
2023-9-3 21:03:53
0xca?
所以说,是 202 还是 202h ?

1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-30 15:22:22 | 显示全部楼层
问题出在除法指令 div bh 上。这条指令将 AX 寄存器的值除以 BH 寄存器的值,并将商存放在 AL 寄存器中,余数存放在 AH 寄存器中。

在你的代码中, AX 寄存器的初始值为 0 , BH 寄存器的值为 1 。所以执行 div bh 后,商为 0 ,余数为 0 。因此,显示的不是"overflow!",而是存储在显存中的ASCII码为0的字符,即乱码。

要解决这个问题,你需要在执行除法指令之前,将 AX 寄存器的值设置为"overflow!"字符串的长度,即9。修改代码如下:
mov ax, 9 ; 设置AX寄存器的值为字符串长度
mov bh, 1
div bh

这样,执行 div bh 后,商为 9 ,余数为 0 。显示的就是正确的"overflow!"字符串了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-30 15:24:19 | 显示全部楼层
isdkz 发表于 2023-8-30 15:22
问题出在除法指令 div bh 上。这条指令将 AX 寄存器的值除以 BH 寄存器的值,并将商存放在 AL 寄存器中,余 ...

ax的初始值是1000h
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-31 17:30:57 | 显示全部楼层
这段代码有一些问题。下面是一些可能的问题:

1. stact segment 段的名字可能是错误的,你可能是想写 stack segment。

2. mov word ptr es:[0],200h 和 mov word ptr es:[2],0 这两行代码尝试修改中断向量表的内容,这在实模式下是允许的,但是在保护模式或者更高级的操作系统中,通常是不允许应用程序直接修改中断向量表的,这样做可能会导致程序崩溃。

3. mov ax,4C00H 和 int 21H 这两行代码是退出程序的DOS中断调用,但是如果你在现代操作系统上运行这段代码,可能会因为不支持此中断调用而崩溃。

4. jmp short do0start行会导致无限循环,因为它会一直跳转到其自身。

5. db "overflow!" 语句在 jmp short do0start 后面,这意味着它不会被执行。因为 jmp short do0start 会无限的跳转到 do0start,所以程序永远不会到达 db "overflow!" 这一行。

6. 计算字符串长度时,你使用的是 mov cx,9 ,但字符串 "overflow!" 实际上包含 9 个字符加一个 null 终止符,总共 10 个字符。在显示字符串时通常需要包括 null 终止符,否则可能会导致显示错误。

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

使用道具 举报

 楼主| 发表于 2023-8-31 20:26:42 | 显示全部楼层
小甲鱼 发表于 2023-8-31 17:30
这段代码有一些问题。下面是一些可能的问题:

1. stact segment 段的名字可能是错误的,你可能是想写 st ...
assume cs:codesg

codesg segment 
 start:     ;安装do0
            mov ax,cs 
            mov ds,ax 
            mov si,offset do0  ;设置ds:si指向源地址
            mov ax,0
            mov es,ax
            mov di,200h        ;设置es:di指向目的地址
            mov cx,offset do0end-offset do0  ;设置cx为传输长度=do0end的偏移地址-do0偏移地址
            cld                      ;设置传输方向为正
            rep movsb
            
                ;设置中断向量表
                mov ax,0
                mov es,ax
                mov word ptr es:[0],200h
                mov word ptr es:[2],0
                        
           
        mov ax,4C00H 
        int 21H 
                
        do0:                    ;显示字符串"overflow!"
                jmp short do0start 
                db "overflow!"     ;数据应该放在安全的空间
        do0start:
                mov ax,cs     ;[cs=0000h]
                mov ds,ax 
                mov si,202 ;设置ds:si指向字符串,jmp指令占用两个字节,字符串从202开始

                mov ax,0b800h 
                mov es,ax
                mov di,12*160+36* 2   ;设置es:di指向显存空间的中间位置
                mov cx,10              ;设置cx为字符串长度
          s:mov al,[si]
            mov es:[di],al 
                inc si
                add di,2
                loop s
                                
                mov ax,4c00h
                int 21h
 do0end:nop
           
           
codesg ends
end start
          
          
          



                               
登录/注册后可看大图



小甲鱼:请你仔细看看,修改0中断,其它都对,只是显示乱码  ?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-3 21:03:53 | 显示全部楼层    本楼为最佳答案   
0xca?
所以说,是 202 还是 202h ?

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

使用道具 举报

发表于 2023-9-3 21:15:06 | 显示全部楼层
小甲鱼 发表于 2023-8-31 17:30
这段代码有一些问题。下面是一些可能的问题:

1. stact segment 段的名字可能是错误的,你可能是想写 st ...

你也开始用gpt回答别人的问题了么,而且这看起来并没有去验证过gpt的回答是否正确,是直接复制粘贴过来的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-3 21:28:14 | 显示全部楼层
别人不认真回答问题没事,毕竟他们就是冲着最佳去的,那就怎么方便的弄到最佳就怎么来了
但是你又不是冲着最佳去的,你不能不认真回答别人的问题呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-3 21:34:46 | 显示全部楼层
人造人 发表于 2023-9-3 21:28
别人不认真回答问题没事,毕竟他们就是冲着最佳去的,那就怎么方便的弄到最佳就怎么来了
但是你又不是冲着 ...

我赞成,小甲鱼确实有点不应该了,至少要检查一下GPT所说的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-21 19:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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