汇编

作者: Onlyoner | 来源:发表于2019-04-02 23:27 被阅读0次

    汇编语言的发展

    机器语言

    由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)
    

    相关文章

      网友评论

          本文标题:汇编

          本文链接:https://www.haomeiwen.com/subject/qlmuhxtx.html