将 10000H~1000FH 中的8个字,逆序拷贝到 20000H~2000FH 中,在拷贝回去。
mov ax , 1000 mov ds , ax mov ax , 2000 mov ss , ax mov sp , 0010 push [0] push [2] push [4] push [6] push [8] push [A] push [C] push [E] |
mov ax , 2000 mov ds , ax mov ax , 1000 mov ss , ax mov sp , 0010 pop [E] pop [C] pop [A] pop [8] pop [6] pop [4] pop [2] pop [0] |
mov ax , ffff mov ds , ax mov ax , 2200 mov ss , ax mov sp , 0100 mov ax , [0] ; ax=C0EA ; ffff:0000 处的值 add ax , [2] ;ax=C0FC mov bx , [4] ; bx=30F0 add bx , [6] ; bx=6021 push ax ; sp=00FE ; 修改的内存单元地址是 220FE 内容为 C0FC push bx ; sp=00FC ; 修改的内存单元地址是 220FD 内容为 6021 pop ax ; sp=00FE ; ax=6021 pop bx ; sp=0100 ; ax=C0FC push [4] ; sp=00FE ; 修改的内存单元地址是 220FE 内容为 30F0 push [6] ; sp=00FC ; 修改的内存单元地址是 220FC 内容为 2F31 |
assume cs:code , ds:data , ss:stack
data segment
dw 0123h , 0456h , 0789h , 0abch , 0defh , 0fedh , 0cbah , 0789h
data ends
stack segment
dw 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
stack ends
code segment
start: mov ax , stack
mov ss , ax
mov sp , 16
mov ax , data
mov ds , ax
push ds:[0]
push ds:[2]
pop ds:[2]
pop ds:[0]
mov ax , 4c00h
int 21h
code ends
end start
|
程序加载进内存,系统就为开头定义的数据分配内存空间并写入数据; 设置 CS:IP 指向start处的第一条指令开始执行。 要查看前面的数据存放在那,就要用 -d cs-1:0 ; |
push、pop如果在masm 下面编译,必须前面加上显示的段寄存器