美文网首页
[汇编语言] 检测点13.1

[汇编语言] 检测点13.1

作者: 耿杰 | 来源:发表于2019-08-07 14:57 被阅读0次

一、在上面的内容中,我们用7ch 中断例程实现loop的功能,则上面的7ch 中断例程所能进行的最大转移位移是多少?

源代码

assume cs:code

code segment
  start: mov ax, 0b800h
         mov es, ax
         mov di, 160 * 12
         
         mov bx, offset  s - offset se
         mov cx, 80
      s: mov byte ptr es:[di], '!'
         add di, 2
         int 7ch
     se: nop

         mov ax, 4c00h
         int 21h
code ends

end start

分析

  • 1、上面代码其实就是jmp short 标号, 是段内短转移,修改范围是 -128~127,它向前转移时最多越过128个字节,向后转移可以最多越过127个字节。
  • 2、(IP) = (IP) + 8位转移。

二、用7ch中断例程完成amp near ptr s指令的功能,用bx向中断例程传递转移位移。

应用举例:在屏幕的第12行,显示data段中以0结尾的字符串。

assume cs:code

data segment
    db 'conversation', 0    
data ends 
 
code segment
    begin:
        mov ax, data
        mov ds, ax
        mov si, 0
        mov ax, 0b800h
        mov es, ax
        mov di, 12*160
    s:
        cmp byte ptr [si], 0
        je ok
        mov al, [si]
        mov es:[di], al
        inc si
        add di, 2
        mov bx, offset s-offset ok
        int 7ch 
    ok:
        mov ax, 4c00h
        int 21h  
        
code ends
end begin

答案

assume cs:code

data segment
    db 'conversation', 0    
data ends 
 
code segment
    begin:
        // 设置 ds:[si], es:[di]的值,利用movsb,把offset schstart的代码复制0000:0200H处
        mov ax, code
        mov ds, ax
        mov si, offset schstart 
        mov ax, 0
        mov es, ax
        mov di, 200h
        mov cx, offset schend-offset schstart
        cld
        rep movsb
   
   // 设置中断向量表 
   setsch:
        mov ax, 0
        mov es, ax
        mov word ptr es:[7ch*4], 200h
        mov word ptr es:[7ch*4+2], 0
    
    // 测试代码        
    start:
        mov ax, data
        mov ds, ax
        mov si, 0
        mov ax, 0b800h
        mov es, ax
        mov di, 12*160
    s:
        cmp byte ptr [si], 0
        je ok
        mov al, [si]
        mov es:[di], al
        inc si
        add di, 2
        mov bx, offset s-offset ok
        int 7ch 
    ok:
        mov ax, 4c00h
        int 21h  
  
 // 7ch对应的schstart程序  
 schstart:
        push bp
        mov bp, sp
        add [bp+2], bx 
        pop bp
        iret  
        
   schend: nop   
       
code ends
end begin

相关文章

  • [汇编语言] 检测点13.1

    一、在上面的内容中,我们用7ch 中断例程实现loop的功能,则上面的7ch 中断例程所能进行的最大转移位移是多少...

  • 汇编语言第三版-检测点13.1

    分析:1. 首先我们知道中断例程是中断处理程序,它是安装在内存的某处地方,并在中断向量表中登记。所以我们可以把这个...

  • [汇编语言] 检测点11.3

    一、 补全下面的程序,统计F000:0处32个字节中,大小[32, 128]的数据的个数。 解答 二、 补全下面的...

  • [汇编语言] 检测点11.4

    一、下面的程序执行后:(ax) = ? 解答 1、mov ax, 0 2、push ax 3、pops 4、mov...

  • [汇编语言] 检测点11.2

    一、写出下面每条指令执行后,ZF、PF、SF、CF、OF等标志位的值 答案:逐条分析 1、sub al, al 2...

  • [汇编语言] 检测点13.2

    一、我们可以编程改变FFFF:0处的指令,使得CPU不去执行BIOS中的硬件系统检测和初始化程序。 答案 1、FF...

  • [汇编语言] 检测点10.5

    目录 1、下面的程序执行后,ax中的数值为多少? 2、下面的程序执行后,ax和bx中的数值为多少? 正文 1、下面...

  • [001][汇编语言]检测点1.1 地址总线

    《汇编语言》检测点1.1 8421 16进制转二进制 需要知道简单的8421十六进制到二进制转换法,不然可能会看不...

  • 汇编语言(第三版)-- 检测点9.1

    若要使程序中的jmp指令执行后,CS:IP指向程序的第一条指令,在data段中应该定义哪些数据? 要使jmp指令执...

  • 汇编语言(第三版)-- 检测点9.3

    loop只有当 cx-1> 0时才会继续循环,因此如果传入cl的值为0,则cl与ch组合为0,需加上1才可以满足c...

网友评论

      本文标题:[汇编语言] 检测点13.1

      本文链接:https://www.haomeiwen.com/subject/gaindctx.html