修改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! 而显示乱码错在哪儿?
问题出在除法指令 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!"字符串了。 isdkz 发表于 2023-8-30 15:22
问题出在除法指令 div bh 上。这条指令将 AX 寄存器的值除以 BH 寄存器的值,并将商存放在 AL 寄存器中,余 ...
ax的初始值是1000h 这段代码有一些问题。下面是一些可能的问题:
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 终止符,否则可能会导致显示错误。
小甲鱼 发表于 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中断,其它都对,只是显示乱码? 0xca?
所以说,是 202 还是 202h ?
小甲鱼 发表于 2023-8-31 17:30
这段代码有一些问题。下面是一些可能的问题:
1. stact segment 段的名字可能是错误的,你可能是想写 st ...
你也开始用gpt回答别人的问题了么,而且这看起来并没有去验证过gpt的回答是否正确,是直接复制粘贴过来的 别人不认真回答问题没事,毕竟他们就是冲着最佳去的,那就怎么方便的弄到最佳就怎么来了
但是你又不是冲着最佳去的,你不能不认真回答别人的问题呀
人造人 发表于 2023-9-3 21:28
别人不认真回答问题没事,毕竟他们就是冲着最佳去的,那就怎么方便的弄到最佳就怎么来了
但是你又不是冲着 ...
我赞成,小甲鱼确实有点不应该了,至少要检查一下GPT所说的
页:
[1]