日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java学习笔记8-1——汇编语言入门

發布時間:2023/12/10 java 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java学习笔记8-1——汇编语言入门 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 概述
  • 進制運算
  • 二進制
  • 數據寬度
  • 無符號數和有符號數
  • 原碼、反碼、補碼
  • 位運算
  • 位運算實現加減乘除
  • 匯編學習環境和必要說明
    • 匯編語言
    • 通用寄存器
    • 內存
  • 未完待續

概述

為什么要學習匯編語言

進制運算

運算的本質是查表

二進制

為什么要學習理解二進制?
寄存器、內存、位…底層的每一個位都是有含義的。這是匯編入門理解的基礎。
匯編高級則是了解程序的深層和操作系統的內核。

數據寬度

  • 計算機內存有限制,數字沒有無窮大(長度),因此要給數字增加數據寬度
    bit:1位
    Byte:8位
    Word:16位
    DWord:32位
  • C、C++和Java等都需要定義數據的類型。計算機底層需要我們給這些數據定義寬度。
    位:0、1
    字節:0~0xFF
    字:0~0xFFFF
    雙字:0~0xFFFFFFFF
  • 在計算機中,每一個數據需要給它定義類型。給它定義寬度,在內存中的寬度。

無符號數和有符號數

無符號數規則
你這數字是什么,那就是什么(就是一串數字)

1001 1010 十六進制:0x9A 十進制:154

有符號數規則
最高位是符號位:負數:1;正數:0

1001 1010 如何轉換?

原碼、反碼、補碼

有符號數的編碼規則
原碼:最高位是符號位,其余位表示數值的大小

反碼:

  • 正數:反碼和原碼相同
  • 負數:符號位一定是1,其余位對原碼取反

補碼:

  • 正數:補碼和原碼相同
  • 負數:符號位一定是1,反碼+1
以8位數據舉例 如果是正數,大家都一樣 1: 原碼:0 0 0 0 0 0 0 1 反碼:0 0 0 0 0 0 0 1 補碼:0 0 0 0 0 0 0 1如果是負數 -1 原碼:1 0 0 0 0 0 0 1 反碼:1 1 1 1 1 1 1 0 補碼:1 1 1 1 1 1 1 1-7 原碼:1 0 0 0 0 1 1 1 反碼:1 1 1 1 1 0 0 0 補碼:1 1 1 1 1 0 0 1

如果看到一個二進制的數字,需要了解它是無符號數還是有符號數

位運算

2*8的最高效計算方式?

  • 聲明變量、賦值等,位運算比任何方式運算速度都快,比直接寫數字也都快。例如:int a = 1<<4;比int a = 16;快

很多底層的調試器,需要通過位來判斷CPU的狀態

與運算(and &)
全都為1,結果為1。

或運算(or |)
只要有一個1,結果都為1。

異或運算(xor ^)
不一樣就是1。

非運算(單目運算符 not ~)
取反。(單目運算符意為只需一個數字就能完成操作)

通過位運算可以實現加減乘除。
位運算
移動位,左移為×2,右移為÷2

0000 0001 1 0000 0010 2 0000 0100 4 0000 1000 8

左移:(shl <<)
所有二進制位全部左移若干位,高位丟棄,低位補0

0000 0001 左移1位 0000 0010

右移:(shr >>)
所有二進制位全部右移若干位,低位丟棄,高位就要補0或1(符號位決定補0還是補1)

0000 0001 右移1位 0000 0000

位運算實現加減乘除

計算機只認識0和1
基本數學是建立在加減乘除上的,只要搞定加法,其他都能用加法表示。

4 + 5 =?

# 二進制加法: 0000 0100 0000 0101 --------------(計算機不會直接加的) 0000 1001# 計算機實現加法的原理: # 第一步:異或 如果不考慮進位,異或就可以直接出結果。 0000 0100 0000 0101 -------------- 0000 0001# 第二步:與運算 判斷進位,如果與運算結果為0則表示沒有進位 0000 0100 0000 0101 -------------- 0000 0100# 第三步:將與運算的結果左移一位 0000 0100——>0000 1000# 第四步:將上一步的結果跟前面異或的結果再異或 0000 1000 0000 0001 -------------- 0000 1001# 第五步:與運算 判斷進位,如果與運算結果為0則表示沒有進位 0000 1000 0000 0001 -------------- 0000 0000 最終結果就是與運算結果的上一個異或運算的結果。否則繼續重復步驟一到五。

4 - 5 =?

即4+(-5) 計算機中的負數用補碼表示 # 二進制減法: 0000 0100 1111 1011 --------------(計算機不會直接減的) 1111 1111 # 第一步:異或 如果不考慮進位,異或就可以直接出結果。 0000 0100 1111 1011 -------------- 1111 1111 # 第二步:與運算 判斷進位,如果與運算結果為0則表示沒有進位 0000 0100 1111 1011 -------------- 0000 0000所以最終結果: 1111 1111

乘:x*y,就是y個x相加,還是加法

除:x/y,本質就是減法,就是x能減去多少個y,本質也是加法

計算機只會做加法
機器語言就是位運算。都是電路來實現的,這就是計算機最底層的本質。

對這些數定義一些規則(數據寬度、有符號數和無符號數、原碼反碼補碼這些),規則之上加入位運算,就能表示很多東西。

匯編學習環境和必要說明

匯編語言

即通過指令來代替二進制編碼。
例如上面的復雜的加法操作通過一個ADD指令,使計算機將ADD直接轉換為二進制加法操作的機器語言

在學習匯編之前,需要先掌握環境的配置:

  • VC6(程序到匯編的理解)
  • OD
  • 抓包工具
  • 加密解密工具
  • 學匯編不是為了寫代碼,是為了理解程序的本質。
    建議學習32位的《匯編語言》,至于64位,本質架構區別不大,只是,尋址能力增加。
    匯編入門:了解匯編和程序的對應關系,程序的本質即可。

    通用寄存器

    寄存器:
    存儲數據:CPU>內存>硬盤
    32位CPU
    64位CPU

    通用寄存器(可以存儲任意的內容)
    32位的通用寄存器只有8個:
    EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI
    存值的范圍:0~FFFFFFFF

    計算機向寄存器存值:
    mov指令

    mov 地址,值 mov 地址1,地址2

    不同的寄存器

    FFFFFFFF FFFF FF 32位 16位 8位 EAX AX AL ECX CX CL EDX DX DL EBX BX BL ESP SP AH EBP BP CH ESI SI DH EDI DI BH8位 L:低八位 H:高8位

    除了通用寄存器之外,其他的寄存器每一位都有其特定的功能。比如開機關機啥的。

    內存

    寄存器很小,不夠用,所以數據要放在內存中。
    每個應用程序進程都有4GB的內存空間(但是相當于空頭支票),程序真正運行的時候才會用到物理內存。
    1B = 8bit
    1KB = 1024B

    4G的內存(4096M)最終計算為位,就是這個內存可以存儲的最大容量。因此4G內存中的內存地址很多,空間很大。

    內存地址
    存一個數:占用的大小?數據寬度?存到哪里?
    計算機中內存很多,空間很大,每個空間分配一個地址、名字。這些給內存起的編號,就是我們的內存地址。

    每個內存地址都有一個編號。可以通過這些編號向里面存值。
    內存如何存值?

    匯編如何向內存中寫值 mov 數據寬度 內存地址,值例mov byte ptr ds:[0x19FF70],1 傳遞的值的大小一定要和數據寬度匹配

    內存地址有多種寫法:
    ds:[0x19FF70+4] 內存地址偏移
    ds:[eax] 寄存器
    ds:[eax+4] 寄存器偏移

    數組[]:
    ds:[reg+reg*{1,2,4,8}] 數組
    ds:[reg+reg*{1,2,4,8}] 數組偏移

    未完待續

    總結

    以上是生活随笔為你收集整理的Java学习笔记8-1——汇编语言入门的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。