汇编 第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

   

  

原文地址:https://www.cnblogs.com/wtblogwt/p/9942237.html