lm68140318 发表于 2023-8-30 15:22:00

修改0中断


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:,200h
                mov word ptr es:,0
                       
          
      mov ax,4C00H
      int 21H
               
        do0:                  ;显示字符串"overflow!"
                jmp short do0start
                db "overflow!"   ;数据应该放在安全的空间
        do0start:
                mov ax,cs   ;
                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,
          mov es:,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! 而显示乱码错在哪儿?




isdkz 发表于 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!"字符串了。

lm68140318 发表于 2023-8-30 15:24:19

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

ax的初始值是1000h

小甲鱼 发表于 2023-8-31 17:30:57

这段代码有一些问题。下面是一些可能的问题:

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

2. mov word ptr es:,200h 和 mov word ptr es:,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 终止符,否则可能会导致显示错误。

lm68140318 发表于 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:,200h
                mov word ptr es:,0
                       
          
      mov ax,4C00H
      int 21H
               
        do0:                  ;显示字符串"overflow!"
                jmp short do0start
                db "overflow!"   ;数据应该放在安全的空间
        do0start:
                mov ax,cs   ;
                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,
          mov es:,al
                inc si
                add di,2
                loop s
                               
                mov ax,4c00h
                int 21h
do0end:nop
          
          
codesg ends
end start
          
          
          


https://i.postimg.cc/vBnrMXLr/1111.png


小甲鱼:请你仔细看看,修改0中断,其它都对,只是显示乱码?

人造人 发表于 2023-9-3 21:03:53

0xca?
所以说,是 202 还是 202h ?


人造人 发表于 2023-9-3 21:15:06

小甲鱼 发表于 2023-8-31 17:30
这段代码有一些问题。下面是一些可能的问题:

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

你也开始用gpt回答别人的问题了么,而且这看起来并没有去验证过gpt的回答是否正确,是直接复制粘贴过来的

人造人 发表于 2023-9-3 21:28:14

别人不认真回答问题没事,毕竟他们就是冲着最佳去的,那就怎么方便的弄到最佳就怎么来了
但是你又不是冲着最佳去的,你不能不认真回答别人的问题呀

yinda_peng 发表于 2023-9-3 21:34:46

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

我赞成,小甲鱼确实有点不应该了,至少要检查一下GPT所说的
页: [1]
查看完整版本: 修改0中断