鱼C论坛

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

[已解决]修改0中断

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

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

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

x

  1. assume cs:codesg,ds:data,ss:stact

  2. data segment  ;数据段
  3.         db "overflow!"

  4. data ends

  5. stact segment ;栈段

  6. stact ends

  7. codesg segment
  8. start:     ;安装do0
  9.             mov ax,cs
  10.             mov ds,ax
  11.             mov si,offset do0  ;设置ds:si指向源地址
  12.             mov ax,0
  13.             mov es,ax
  14.             mov di,200h        ;设置es:di指向目的地址
  15.             mov cx,offset do0end-offset do0  ;设置cx为传输长度=do0end的偏移地址-do0偏移地址
  16.             cld                      ;设置传输方向为正
  17.             rep movsb
  18.             
  19.                 ;设置中断向量表
  20.                 mov ax,0
  21.                 mov es,ax
  22.                 mov word ptr es:[0],200h
  23.                 mov word ptr es:[2],0
  24.                        
  25.           
  26.         mov ax,4C00H
  27.         int 21H
  28.                
  29.         do0:                    ;显示字符串"overflow!"
  30.                 jmp short do0start
  31.                 db "overflow!"     ;数据应该放在安全的空间
  32.         do0start:
  33.                 mov ax,cs     ;[cs=0000h]
  34.                 mov ds,ax
  35.                 mov si,202 ;设置ds:si指向字符串,jmp指令占用两个字节,字符串从202开始

  36.                 mov ax,0b800h
  37.                 mov es,ax
  38.                 mov di,12*160+36* 2   ;设置es:di指向显存空间的中间位置
  39.                 mov cx,9              ;设置cx为字符串长度
  40.           s:mov al,[si]
  41.             mov es:[di],al
  42.                 inc si
  43.                 add di,2
  44.                 loop s
  45.                                
  46.                 mov ax,4c00h
  47.                 int 21h
  48. do0end:nop
  49.           
  50.           
  51. codesg ends
  52. end start
  53.           
复制代码





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




最佳答案
2023-9-3 21:03:53
  1. 0xca?
  2. 所以说,是 202 还是 202h ?
复制代码


1.png
小甲鱼最新课程 -> https://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。修改代码如下:

  1. mov ax, 9 ; 设置AX寄存器的值为字符串长度
  2. mov bh, 1
  3. div bh
复制代码


这样,执行 div bh 后,商为 9 ,余数为 0 。显示的就是正确的"overflow!"字符串了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

ax的初始值是1000h
小甲鱼最新课程 -> https://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 终止符,否则可能会导致显示错误。

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

  1. assume cs:codesg

  2. codesg segment
  3. start:     ;安装do0
  4.             mov ax,cs
  5.             mov ds,ax
  6.             mov si,offset do0  ;设置ds:si指向源地址
  7.             mov ax,0
  8.             mov es,ax
  9.             mov di,200h        ;设置es:di指向目的地址
  10.             mov cx,offset do0end-offset do0  ;设置cx为传输长度=do0end的偏移地址-do0偏移地址
  11.             cld                      ;设置传输方向为正
  12.             rep movsb
  13.             
  14.                 ;设置中断向量表
  15.                 mov ax,0
  16.                 mov es,ax
  17.                 mov word ptr es:[0],200h
  18.                 mov word ptr es:[2],0
  19.                        
  20.           
  21.         mov ax,4C00H
  22.         int 21H
  23.                
  24.         do0:                    ;显示字符串"overflow!"
  25.                 jmp short do0start
  26.                 db "overflow!"     ;数据应该放在安全的空间
  27.         do0start:
  28.                 mov ax,cs     ;[cs=0000h]
  29.                 mov ds,ax
  30.                 mov si,202 ;设置ds:si指向字符串,jmp指令占用两个字节,字符串从202开始

  31.                 mov ax,0b800h
  32.                 mov es,ax
  33.                 mov di,12*160+36* 2   ;设置es:di指向显存空间的中间位置
  34.                 mov cx,10              ;设置cx为字符串长度
  35.           s:mov al,[si]
  36.             mov es:[di],al
  37.                 inc si
  38.                 add di,2
  39.                 loop s
  40.                                
  41.                 mov ax,4c00h
  42.                 int 21h
  43. do0end:nop
  44.           
  45.           
  46. codesg ends
  47. end start
  48.           
  49.           
  50.           
复制代码




                               
登录/注册后可看大图



小甲鱼:请你仔细看看,修改0中断,其它都对,只是显示乱码  ?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


1.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

你也开始用gpt回答别人的问题了么,而且这看起来并没有去验证过gpt的回答是否正确,是直接复制粘贴过来的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

我赞成,小甲鱼确实有点不应该了,至少要检查一下GPT所说的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-19 04:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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