汇编语言的发展
机器语言
由0和1组成
如:0101 0001 1101 0110
汇编语言
image.png2 ^ 10 == 1024
2 ^ 20 == 2 ^ 10 * 2 ^ 10 = 1024 * 1024 = 1M
2^20 == 1M
2^30 == 1G
2^32 == 1G*2^2 == 4G
64位CPU 单次传递8个字节!! 16个16进制位来标示一个64位数据!!
1 Byte == 8 bit
1B
1KB == 1024 Byte
1MB == 1024 * 1024 Byte
16^5 == 2^4^5 == 2^(4*5) == 2 ^ 20
8086寻址能力 1M 地址方位 == 0x00000 - 0xfffff
假设有个地址:0xCFFA7我们16位CPU没法直接接受这个数据,因为只能接受最大0xFFFF
0xCFFA7 = 0xCFFA * 16 + 0x007
0xCFFA7 = 0xCFF0 * 16 + 0x0A7
0xCFFA7 = 0xCF00 * 16 + 0xFA7
物理地址 = 段地址 * 16 + 偏移地址
C000 : FFA7
User Name:
www.weste.net
RegKey:
27R3-1I2UJHRJSF3C3FRTQZXJ
image.png
image.png
image.png
assume cs:code
code segment
;dw 1,2,3,4,5,6,7
;db 'hello'
;db "abs"
db 20 dup(0) ;数据
db 20 dup(0) ;栈
hank:
;定义数据段
mov dx,cs
mov ds,dx
mov ax,1122h
mov [0],ax
;定义栈段
mov ss,dx
mov sp,40
push ax
;退出程序
mov ah,4ch
int 21h
code ends
end abc
assume cs:code,ds:data,ss:stack
;栈段(存放数据,比如高级语言中的局部变量)
stack segment
db 20 dup(0)
stack ends
;数据段(存放数据,比如高级语言中的全局变量)
data segment
db 20 dup(0)
str db "Hello World!$"
data ends
;代码段
code segment
start:
;设置ds和ss
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
;业务逻辑代码
call print
mov ax,1122h
;退出程序
mov ah,4ch
int 21h
print:
mov ax,3344h
push ax
mov dx,offset str;offset 获得标号对应的偏移
mov ah,9h
int 21h
pop ax
ret
code ends
end start
assume cs:code,ds:data,ss:stack
;栈段(存放数据,比如高级语言中的局部变量)
stack segment
db 20 dup(0)
stack ends
;数据段(存放数据,比如高级语言中的全局变量)
data segment
db 20 dup(0)
str db "Hello World!$"
data ends
;代码段
code segment
start:
;设置ds和ss
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
;业务逻辑代码
call print
mov ax,1122h
;退出程序
mov ah,4ch
int 21h
print:
mov ax,3344h
push ax
mov dx,offset str;offset 获得标号对应的偏移
mov ah,9h
int 21h
pop ax
ret
code ends
end start
assume cs:code,ds:data,ss:stack
;栈段(存放数据,比如高级语言中的局部变量)
stack segment
db 20 dup(0)
stack ends
;数据段(存放数据,比如高级语言中的全局变量)
data segment
db 20 dup(0)
data ends
;代码段
code segment
start:
;设置ds和ss
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
;业务逻辑代码
mov bx,3h
mov dx,4h
call sum
;退出程序
mov ah,4ch
int 21h
;参数:传递两个字型参数,参数分别用bx,dx存放
;返回值:返回值存放在ax中
sum:
mov ax,bx
add ax,dx
ret
code ends
end start
assume cs:code,ds:data,ss:stack
;栈段(存放数据,比如高级语言中的局部变量)
stack segment
db 20 dup(0)
stack ends
;数据段(存放数据,比如高级语言中的全局变量)
data segment
db 20 dup(0)
data ends
;代码段
code segment
start:
;设置ds和ss
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
;业务逻辑代码
push 1h
push 3h
push 4h
call sum
;add sp,6
push 1h
push 3h
push 4h
call sum
;add sp,6
push 1h
push 3h
push 4h
call sum
;add sp,6
;退出程序
mov ah,4ch
int 21h
;参数:传递两个字型参数,参数分别用bx,dx存放
;返回值:返回值存放在ax中
sum:
mov bp,sp
mov ax,ss:[bp + 2]
add ax,ss:[bp + 4]
add ax,ss:[bp + 6]
ret 6
code ends
end start
;函数栈平衡:保证函数调用前后的栈顶是一致的
;1.外平栈:由函数外部保持栈平衡
;2.内平栈:由函数内部保持栈平衡
assume cs:code,ds:data,ss:stack
;栈段(存放数据,比如高级语言中的局部变量)
stack segment
db 20 dup(0)
stack ends
;数据段(存放数据,比如高级语言中的全局变量)
data segment
db 20 dup(0)
str db "Hello World!$"
data ends
;代码段
code segment
start:
;设置ds和ss
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
;业务逻辑代码
push 3h ;传递参数
push 4h
call sum
;add sp,6
;退出程序
mov ah,4ch
int 21h
;参数:传递两个字型参数,参数分别用bx,dx存放
;返回值:返回值存放在ax中
sum:
;保护bp
push bp
mov bp,sp
sub sp,20 ;20字节留作局部变量
;保护寄存器
push bx
push cx
push dx
;*****************业务逻辑代码
;定义两个局部变量
mov ss:[bp - 2],1h
mov ss:[bp - 4],2h
;修改寄存器
mov bx,2h
mov cx,3h
mov dx,4h
mov ax,ss:[bp + 2]
add ax,ss:[bp + 4]
add ax,ss:[bp - 2]
add ax,ss:[bp - 4]
;*****************业务逻辑代码
;恢复寄存器
pop dx
pop cx
pop bx
;恢复sp
mov sp,bp
;恢复bp
pop bp
ret 4
code ends
end start
;函数栈平衡:保证函数调用前后的栈顶是一致的
;1.外平栈:由函数外部保持栈平衡
;2.内平栈:由函数内部保持栈平衡
;int sum(int a, int b)
;{
; int c = 1;
; int d = 2;
; return a + b + c + d;
;}
;函数的调用流程
;1.push参数(64位cpu 任性使用寄存器)
;2.call指令调用(将下一条指令地址入栈)
;3.保护bp寄存器,将sp赋值给bp
;4.提升sp指针,作为局部变量空间(sp 减去值)
;5.保护寄存器
;6.业务逻辑
;7.恢复寄存器
;8.恢复sp(sp指向bp/sp 加上值)
;9.恢复bp(pop bp)
;10.返回(ret)
网友评论