zoukankan      html  css  js  c++  java
  • 汇编学习--第四天

    5.3 在Debug中跟踪用loop指令实现的循环程序

    在汇编程序中,数据不能以字母开头,所以大于9FFFH的十六进制数据都要在前面加一个0

    因为DS=075AH,所以我们可以知道程序地址在DS+10H=076AH

    程序的第一条指令指令为CS:IP

    显示出DS:0006H地址储存的数据

    g “偏移地址”

    将执行偏移地址之前的指令

    当进入循环时,使用p指令,Debug将一直执行到(cx)=0为止

    5.4 Debug和汇编编译器masm对指令的不同处理

    Debug中

    mov ax,2000
    mov ds,ax
    mov al,[0]
    mov bl,[1]
    mov cl,[2]

    在Debug中会将[0]处理为(al)=((ds)*16 + 0)...

    masm编译器中

    assume code
    code segment
            mov ax,2000
            mov ds,ax
            mov al,[0]
            mov bl,[1]
    
            mov ax,4c00h
            int 21h
    code ends
    ends

    会将[0]处理为00,不会加上段地址

    解决办法:使用mov al,ds:[0]

    5.5 loop和[bx]的联合应用

    计算ffff:0~ffff:b的数据总和,结果储存在dx中

    1.不能直接将ds:[0]~ds:[0bh]中的数据放入dx中,因为前者是一个字节,8位寄存器,后者是一个字,两字节,16位寄存器。

    2.不能使用dl累加ds:[0]~ds:[0bh]中数据,因为dl位8位寄存器,最大存储的数据为255,ds:[0]~ds:[0bh]每个都是8位寄存器,累加容易越界。

    因此,我们使用一个中介ax的16位寄存器中的低位储存ds:[0]~ds:[0bh],再累加到dx

    assume cs:code
    code segment
            mov ax,0ffffh
            mov ds,ax
            
            mov al,ds:[0]
            mov ah,0
            mov dx,ax
            
            mov al,ds:[1]
            mov ah,0
            mov dx,ax
            
            ...
        
            mov al,ds:[0bh]
            mov ah,0
            add dx,ax
            
            mov ax,4c00h
            int 21h
            
    code ends
    end

    使用循环优化上面程序

    assume cs:code
    code segment
            mov ax,0ffffh
            mov ds,ax
            mov bx,0
            mov cx,12
            
    s:        mov al,ds:[bx]
            mov ah,0
            add dx,ax
            inc bx
            loop s
            
            mov ax,4c00h
            int 21h
            
    code ends
    end

    5.6 段前缀

    出现在访问内存单元的指令中,用于显示地指明内存单元的段地址的"ds:","cs:","ss:","es:",在汇编语言中称为段前缀

    5.7 一段安全的空间

    DOS和其他合法程序一般都不会使用0:200~0:2ff(00200hh~002ffh)的256个字节空间。因此我们需要写入数据就往0:200~0:2ff中写入。

    5.8 段前缀的使用

    assume cs:code
    code segment
            mov ax,0ffffh
            mov ds,ax    ;ds段寄存器
    
            mov ax,20h
            mov es,ax    ;es段寄存器
            
            mov bx,0
            mov cx,12
            
    s:        mov al,ds:[bx]
            mov es:[bx],al
            inc bx
            loop s
            
            mov ax,4c00h
            int 21h
            
    code ends
    end

    实验4 [bx]和loop的使用

     (1)

    assume cs:code
    code segment
        mov ax,20h
        mov ds,ax
        
        mov bx,0
        mov cx,64
    s:    mov [bx],bl
        inc bl
        loop s
        
        mov ax,4c00h
        int 21h
        
    code ends
    end

    (2)没变,刚好9条,第一题应该地址和传递数据是分开的,所以第二题要求9条

     1 assume cs:code
     2 code segment
     3     mov ax,20h
     4     mov ds,ax
     5     
     6     mov bx,0
     7     mov cx,64
     8 s:    mov [bx],bl
     9     inc bl
    10     loop s
    11     
    12     mov ax,4c00h
    13     int 21h
    14     
    15 code ends
    16 end

    (3)

    1) 复制的是存放程序代码的数据,从076a:0~076a:11

    0~10h一共需要执行17次

    所以第一个空填076ah,第二个空填17

  • 相关阅读:
    python-json序列化和反序列化
    python-列表元祖字典集合、字符、字符串、函数处理
    Nmon监控服务端性能
    python-使用qq邮箱向163邮箱发送邮件、附件
    测试结论
    性能术语
    测试点-app、web、异常
    提测标准
    深度优先搜索的演示学习法——BlackBlank平台应用教学案例
    【赛后补题】ccpc2107秦皇岛H题
  • 原文地址:https://www.cnblogs.com/Mayfly-nymph/p/11066323.html
Copyright © 2011-2022 走看看