067-Assembly汇编04

1.例题
10000H 33
10001H 11
10002H 22
10003H 66

省略段地址操作
mov ax,[0]
mov bx,[1]
mov cx,[2]
ax是1133H
bx是2211H
cx是6622H

因为是8086,16位,当然是取2个单元啦!!!

2.数据段
12340H-12349H
一共10个内存单位
那么就是10个字节
这段空间可以存放10个字节的数据

例子
12340H-12349H数据段
我们想把前三个单元中的数据加起来
mov ax,1234H
mov ds,ax
mov bx,0
add bx,[0]
add bx,[1]
add bx,[2]


另一个例子
如果是累加前三个字型单元的数据
那么一个字是2个字节,16位,也就是2个内存单元,所以
mov ax,1234H
mov ds,ax
mov bx,[0]
add bx,[2]
add bx,[4]

3.栈
先进后出
基于8086CPU编程的时候,可以将一段内存当做栈来使用
push    入栈
pop    出栈
入栈和出栈的操作都是以字为单位进行的,所以就是2个字节,16位

例子
mov ax,1122H
mov bx,3344H
mov cx,5566H
push ax
push bx
push cx
现在,往栈里面放了3个值
那么现在取出的话
pop ax
ax就是5566H
pop bx
bx就是3344H
pop cx
cx就是1122H


4.CPU如何把一段内存空间当做栈使用
SS和SP
SS stack segment 栈的段地址寄存器
SP stack pointer   栈指针寄存器
之前是cs和ip
cs code segment 代码段寄存器
ip instruction pointer 指令指针寄存器


5.push指令
push ax
1.sp=sp-2
2.将ax中的内容送入ss:sp指向的内存单元处,ss:sp此时指向新栈顶

例子
12222H
12223H
12224H
12225H
12226H
现在这个是栈段寄存器的物理地址
那么SS段地址是1000H
那么SP偏移地址是2222H...

现在我们存一个东西比如8899H
那么
12225H    99H
12226H    88H
那么现在SP就在2224了

如果再存一个6677H
那么
12223H    77H
12224H    66H
12225H    99H
12226H    88H

看起来复杂,仔细看一遍还是挺简单的
所以SP=SP-2
那么同理
如果是pop,就是
SP=SP+2


6.栈顶越界
如何保证栈顶不会超出栈空间
向上溢出
向下溢出

7.定义一个段
segment---ends
比如
abc segment
...
abc ends

8.示例
assume cs:abc
abc segment
start:     ...
    ...
    ...
abc ends
end

9.标号
标号指代了一个地址
比如刚刚写的abc,就是一个标号
放在segment前面,作为段的名称
这个段的名称最终会被处理为一个段的段地址

10.写一个2^3
abc segment
    mov ax,2
    add ax,ax
    add ax,ax
abc ends
end

11.DOS
DOS是一个单任务操作系统


12.示例代码
assume cs:abc
abc segment
    mov ax,2
    add ax,ax
    
    mov ax,4c00H
    int 21H
abc ends
end

13.程序返回
在末尾添加
mov ax,4c00H
int 21H

14.描述性符号()
1.ax中的内容为0010H,我们可以这样描述(ax)=0010H
2.2000:1000处的内容为0010H,可以描述(21000H)=0010H
3.对于mov ax,[2],可以描述(ax)=((ds)*16+2)
4.对于mov [2],ax,可以描述((ds)*16+2)=(ax)
5.对于add ax,2,可以描述为(ax)=(ax)+2

15.idata常量
mov ax,[0]这样是把ds:0的数据送入ax,那么在[...]里用一个常量0表示内存单元的偏移地址,用idata表示常量
举例
mov ax,[idata],就相当于mov ax,[1]等
比如
mov ax,idata就相当于mov ax,2等


16.loop指令
通常cx中存放循环次数


17.简单示例
assume cs:abc
abc segment
    mov ax,2
    add ax,ax
    
    mov ax,4c00H
    int 21h
abc ends
end


18.计算2^10
assume cs:abc
abc segment
    mov ax,2
    mov cx,9

s:    add ax,ax
    loop s

    mov ax,4c00H
    int 21H
abc ends
end

19.举例计算ffff:0006单元中的数字乘以3
assume cs:abc
abc segment
    mov ax,0ffffH
    mov ds,ax
    mov ax,[6]
    mov cx,3
s:    
    add dx,ax
    loop s
    
    mov ax,4c00H
    int 21H
abc ends
end

20.通用寄存器溢出
一个数字必须要小于等于65535,也就是2的16次-1
2^16=65536
也就是16进制的FFFF

21.loop与bx
assume cs:code
code segment
    mov ax,0ffffH
    mov ds,ax
    mov bx,0
    mov dx,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


22.循环
assume cs:code
code segment
    mov ax,0ffffH
    mov ds,ax
    mov bx,0
    mov dx,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

23.示例
assume cs:code
code segment
    mov bx,0
    mov cx,12
s:
    mov ax,0ffffH
    mov ds,ax
    mov dl,[bx]
    mov ax,0020H
    mov ds,ax
    mov [bx],dl
    inc bx
    loop s

    mov ax,4c00H
    int 21H
code ends
end


24.示例
assume cs:code
code segment
    mov ax,0ffffH
    mov ds,ax
    mov ax,0020H
    mov es,ax
    mov bx,0
    mov cx,12
s:
    mov dl,[bx]
    mov es:[bx],dl
    inc bx
    loop s

    mov ax,4c00H
    int 21H
code ends
end


25.在代码段中使用数据
assume cs:code
code segment
    dw 0123H,0444H,0555H
    mov bx,0
    mov ax,0
    mov cx,8
s:
    add ax,cs:[bx]
    add bx,2
    loop s

    mov ax,4c00H
    int 21H
code ends
end


26.
dw define word
db define byte


27.标号
assume cs:code
code segment
    dw 1111H,2222H
start:
    mov bx,0
    mov ax,0
    mov cx,8
s:
    add ax,cs:[bx]
    add bx,2
    loop s

    mov ax,4c00H
    int 21H
code ends
end start

28.分段示例
assume cs:code, ds:data, ss:stack
data segment
    dw 1111H,2222H,3333H
data ends

stack segment
    dw 0,0,0,0
stack ends

code segment
start:
    mov ax,stack
    mov ss,ax
    mov sp,16
    mov ax,data
    mov ds,ax
    mov bx,0
    mov cx,8
s:
    push [bx]
    add bx,2
    loop s

    mov bx,0
    mov cx,8
s0:
    pop [bx]
    add bx,2
    loop s0

    mov ax,004cH
    int 21H
code ends
end start

发布了1081 篇原创文章 · 获赞 42 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/qq_33781658/article/details/104567537
067