汇编(三)

1、伪指令

  • segment 段
    1
    2
    段名称  segment
    段名称 ends
    段名称也要标号
  • end 整个程序的结束
  • assume 假设某一 段寄存器 和程序中的某一用 segment…ends定义的段 相关联

2、程序返回

1
2
mov ax,4c00H
int 21H

示例

1
2
3
4
5
6
7
8
9
10
11
assume cs:abc

abc segment
mov ax,2
add ax,ax
add ax,ax
mov ax,4c00H
int 21H
abc ends

end

将 MASM中的程序和hello.asm 放到同一个目录下,打开DOSBOX,执行ML.EXE生成可执行文件 或者vscode安装 MASM/TASM 插件

3.获取内存中的数据

  • 方式1

    1
    2
    mov bx,2
    mov ax,[bx]

    将bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将SA:EA处的数据送入ax中 即 (ax) = (ds*16+(bx)) 其中( )表示地址中存储的内容

  • 方式2

    1
    mov ax,ds:[0]

4.loop 循环

1
2
3
4
5
6
7
8
9
10
11
12
assume cs:code
code segment
mov ax,2
mov cx,11
s:add ax,ax
loop s

mov ax,4c00h
int 21h
code ends

end

cx 中存放的是循环的次数

5.累加ffff0H ~ ffffbH 内存单元的数据到dx中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
assume cs:code

code segment
mov ax,0ffffh
mov ds,ax

mov bx,0

mov cx,12
s: mov al,[bx]
mov ah,0 ;内存中获取到的是8位的数据不能直接和dx16位寄存器进行操作,所以需要ax中转
add dx,ax
inc bx
loop s

mov ax,4c00h
int 21h
code ends
end

内存安全空间

0:200 ~ 0:2ff 即
0002:00 ~ 0002:ff

注意事项

汇编源代码中数据不能以字母开头

  • 错误示范
    1
    mov ax,ffffH
  • 正确示范
    1
    mov ax,0ffffH

通用寄存器的一般用法

AX 通用寄存器什么都可以放
BX 一般存放内存单元寻址的相对地址与DS搭配
CX 一般存放循环执行的次数与loop搭配使用