就是在《汇编语言》王爽 第三版 p251页
实验12中:
编写一个0号中断程序,使得在除法溢出的时候,屏幕中显示一串字符串。
我自己写的程序如下:
assume cs:code
code segment
start: mov ax,cs
mov ds,ax
mov ax,0
mov es,ax
mov ax,offset s1
mov si,ax
mov di,200H
mov cx,offset s0end- offset s1
cld
rep movsb
mov ax,200H
mov es:[0],ax
mov ax,0
mov es:[2],ax
mov ax,4c00h
int 21h
s1: jmp c0
s0: db "there is a error"
d0: nop
c0: mov ax,cs
mov ds,ax
mov si,offset s0 ;注意这里不能用offest s0,用offset显示是002cH
mov ax,0B800h
mov es,ax
mov di,12*160+30*2
mov cx,offset d0-offset s0
b0: mov al,ds:[si]
mov es:[di],al
inc di
mov es:[di],00000100B
inc di
inc si
loop b0
mov ax,4c00h
int 21h
s0end: nop
code ends
end start
是这样的如果按照以上源程序,除法溢出的时候中断是这样的:

我已经发现问题了,是那个源程序中我注释的哪一行不能用offset s0,
用offset s0的时候,s0是002ch,而不是正确的0202h
(整个程序的思路是按照书上的,把s1后的程序复制到0000h:0200h开始的内存空间,然后更改0号中断向量表中中断向量的地址)
就是想问下这是为什么? 想不通,求各位前辈赐教,谢谢。
------解决方案--------------------
起始地址在编译和运行时不一致的缘故吧。比较简单的解决方法是在 s1: 前面加上 org 200h 语句,这样可以保证编译和运行时起始地址是一样的,从而使得对地址的引用是正确的。
------解决方案--------------------
org 语句是一直就有的吧,汇编语句说明部分也应该有它的,可能是你没太在意吧。
至于书方面,比较规范的推荐应该是那个 intel汇编程序设计;王爽的也被很多人极力推崇,但从这里出现的来源于那书中的题目和代码来看,此书过于偏执,常陷学习者于难以理解的困境中,我个人是不怎么建议的。