汇编

2019-04-02  本文已影响0人  Onlyoner

汇编语言的发展

机器语言

由0和1组成
如:0101 0001 1101 0110

汇编语言

image.png
2 ^ 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)
上一篇下一篇

猜你喜欢

热点阅读