当前位置: 代码迷 >> 汇编语言 >> 关于王爽《汇编语言》实验12的一个小疑点
  详细解决方案

关于王爽《汇编语言》实验12的一个小疑点

热度:215   发布时间:2016-05-02 04:35:26.0
关于王爽《汇编语言》实验12的一个小问题
就是在《汇编语言》王爽 第三版 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汇编程序设计;王爽的也被很多人极力推崇,但从这里出现的来源于那书中的题目和代码来看,此书过于偏执,常陷学习者于难以理解的困境中,我个人是不怎么建议的。
  相关解决方案