zoukankan      html  css  js  c++  java
  • 汇编 第4,5,6,7章

    第4章

    一个源程序从写出到执行的过程:

    1,。编译汇编源程序(产生一个存储源程序的文本文件)

     2.对源程序进行编译连接(生成可执行文件  包括程序和数据以及相关的描述信息)

    3.执行

    二。汇编源程序框架:

    assume cs:codesg

    codesg segment

                mov ax,0123H

                mov bx,0456H

                ...

                ...

                mov ax,4c00H

                int 21H

    codesg ends

    end

    segment和ends是一对成对使用的伪指令,用来定义段

    段名 segment

    ..

    段名 ends

    end是汇编程序结束标记

    assume含义是假设,假设某一段寄存器和程序的某一个用segment和ends定义的段相关联

     在编译连接时可以加上分号,自动忽略中间文件的生成,简化过程。

    在DOS中,command处理各种输入:命令或要执行的程序的文件名。我们就是通过command来进行工作的。

    在DOS中直接执行.exe时,是正在运行的command,将.exe文件中的程序加载入内存。

    command设置CPU的CS:IP指向程序的第一条指令(程序入口),从而程序得以运行。

    程序运行结束后,返回到command中,CPU继续运行command

    第5章

    【bx】和loop指令

    要完整地描述一个内存单元,需要两种信息:1,内存单元地址  2.内存单元长度(类型)

    【bx】表示一个内存单元,段地址在ds中

    loop指令用于循环

    标号:标号代表一个地址

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

    Debug:mov ax,[0]   在汇编源程序中会被当做mov ax,0处理

    要实现预期效果  借助bx,将偏移地址送入bx寄存器中,用【bx】的方式来访问内存单元

    如:

    mov ax,2000H

    mov ds,ax

    mov bx,0

    mov al,[bx]

    如果想像在Debug中那样直接写,需要显式声明段地址所在的寄存器

    mov al,ds:[0]

    如果在“[]”里用寄存器,间接段地址默认在ds中

    loop和【bx】联合实例

    assume cs:code

    code segment

             mov ax,0fffh

             mov ds,ax

             mov bx,0

             mov cx,12

    s:      mov al,[bx]

             mov ah,0

             add dx,ax

             inc bx

             loop s

    mov ax,4c00h

    int 21h

    code ends

    end

    段前缀:出现在访问内存单元的指令中,用于显式地指明内存单元的段地址的"ds:' "cs:" "ss:" "es:

    DOS方式下,一般情况,0:200~0:2ff空间中没有系统或其他程序的数据或代码,尽量使用这段空间

    第六章:包含多个段的程序

    使用不同的段  数据段  栈段

    数据段中  dw(define word)用于定义字数据  db定义字节

    end除了通知编译器程序结束外,还可以通知编译器程序的入口在什么地方end start

    具体用法如下:

    assume cs:code
    a segment
      db 1,2,3,4,5,6,7,8
    a ends
    
    b segment
      db 1,2,3,4,5,6,7,8
    b ends
    
    c1 segment   
      db 8 dup(0)
    c1 ends    
    code segment
    start:
          mov ax,a
          mov ds,ax
          mov bx,0
          mov ax, c1
          mov es,ax
          mov cx,8
    s:   mov ax,[bx]
         mov es:[bx],ax
         add bx,1    
         loop s
    
         mov ax,b
         mov ds,ax
         mov bx,0
         mov ax,c1
         mov es,ax
         mov cx,8
    s2: mov al,[bx]
          mov ah,0
          add es:[bx],ax
          add bx,1
          loop s2
    mov ax,4c00h
    int 21h
    code ends
    end start

     第七章

     更灵活的定位内存地址的方法

    两个指令 or   and

    大小写字母转换:

    转化成大写:置0

    and 11011111b

    转换成小写:置1

    or 00100000b

    大写+20H=小写

    大写+32=小写

    SI和DI

    是8086CPU中与bx功能相近的寄存器,不能分成两个8位寄存器来使用

    利用bx,si,di可以实现更灵活的内存处理方式,类似数组

    如下:

    题目:编程,将datasg段中每个单词的前4个字母改为大写字母。

    代码如下:

    assume cs:codesg,ss:stacksg,ds:datasg
    
    stacksg segment
    dw 0,0,0,0,0,0,0,0
    stacksg ends
    
    datasg segment
    db '1. display      '
    db '2. brows        '
    db '3. replace      '
    db '4. modify      '
    datasg ends
    
    codesg segment
    start:
          mov ax,stacksg
          mov ss,ax
          mov sp,16
    
          mov ax,datasg
          mov ds,ax
          mov bx,0
    
          mov cx,4
    
    s0:  push cx
          mov cx,4
          mov si,3
    
    s:   mov al,[bx+si]
         and al,11011111b
         mov [bx+si],al
         inc si
        loop s
    
        add bx,16
        pop cx
        loop s0
    mov ax,4c00h
    int 21h
    codesg ends
    end start
    
       
    

      

  • 相关阅读:
    C# 实现向指定邮箱发送信息功能
    asp.net webapi 解决跨域问题
    电脑通电自动开机设置
    C# 多个控件绑定一个事件
    C# DataGridView 标题栏背景颜色改变
    C# 输出csv文件后缀乱码
    C# textbox设定为只读后如何改变文本字体颜色
    C# 命名规则
    C# 傅里叶变换 逆变换 调用MathNet包
    使用SharpDevelop配合MonoGame进行游戏开发
  • 原文地址:https://www.cnblogs.com/wtblogwt/p/9942237.html
Copyright © 2011-2022 走看看