汇编基础知识六

这里开始熟悉汇编的指令格式

下图为X86版本的指令格式,X64的指令格式和X86差不多后面有需要的话再详细写

Istruction Prefixes : 可选项

默认二进制文件是前缀和内容混杂在一起只有机器才能识别区别

人工区分方法:

X86格式图已经给我们提示,有四个组,一次最多使用一个组

段前缀指令的作用: 修改使用段寄存器

不加提示默认使用DS

如果有栈寄存器的话会使用SS

push ebp是设置程序为X86位下的16位模式情况下运行

CPU是如何判断程序有关系:

CS中有一个DB位如果CS中DB位为0则16位1位32

现在默认的CPU模式是32位,所以汇编指令就算是使用epb(16位寄存器)最少也是32位

如何使用16位的

只需要在硬编码前面加上前缀 66:即可

效果如上面

当CPU使用32位模式选址方式就会使用32位进行

当DB位为0的时候16位,使用16位寻址方式,当DB为1的时候使用32位寻址方式

决定 硬编码长度是由( Opcode ModR/M SIB )决定。前缀指令只会影响到他自己。

然后,ModR/M 由Opcode决定 SIB由ModR/M决定

虽然这个是叫做One-byte但是都是从这个表里面展开的

由这个图例查找,55,push rbp/13

然后 0F-3F都有两个操作符,前面的是Opcode,后面跟着是ModR/M

如果Opcode跟着 ModR/M的话就是变长,没有则定长

所有两个操作符的就判定前面的是Opcode,ModR/M

这是要理解这个我们可以查询他相关的问题操作符解释

在Intell白皮书里面有Codes for addressing method

可以查到操作符大写解释

下面的Codes for Operand Type

有操作符小写解释

例如大写E前面很明显的写了A ModR/M byte follows the opcode

表中寄存器带个r表示可以随着系统变化而变化,可以是64位的RAX,也可以是32位的EAX,也可以是AX 表中会显示最大的修改位数,带E开头的表示只能修改32位和16位

ERX=EAX or ECX or EDX 等通用寄存器

硬编码 4开头是 INC/DEC 5开头的是push/pop

0-7是 INC PUSH

8-F是DEC POP

40开头的都两行格式,上面的一行表示32位,下面的是64位的。

在b开头的是mov指令

他的写法又不一样,mov AL\R8L,Ib

这样能够很好的解释定长指令不是只有一个字节的

I是Immedlate立即数

b是bate 字节

v是 word doubleword quadword三种情况之一,他取决于你采用数据宽度

所以:

0-7 是 mov rb,lb

8-F 是 mov ERX,Iv

9开头 就是XCHG指令是两个寄存器之间交换而且都是放到EAX中

例:

但0是表示EAX 用EAX放到EAX中所以汇编中把

90作为nop 不做任何操作。

我们通常使用Nop的时候是遇到花指令这个下次有时间再写。

90-97是有规则的,但8-F单独说

表格中如果带有

I64 指令表示这个指令在64位下单独表示,例如INC和DEC

o64 只能在64位系统下使用。

d64 这个指令默认是64位,且不支持32位

f64 在64位操作系统下强制使用64位宽度

能够修改EIP的指令有JCC,call,ret三类

从上表中可以查到JCC的指令可以从 0x70~0x7F,八个指令。

上图是JCC指令示例

不论是70-7F中哪一个都会带有一个字节的数据,那个数据被称为偏移地址。

所以JCC普通跳转地址最大位一个字节(FF/2),80以下往下跳转,80以上往上跳转

条件跳转,后面跟一个字节立即数的偏移(有符号),共两个字节

如果条件成立调到当前指令地址+当前指令长度+LB

最大值:向前跳转7F,向后跳转80

而且当你要跳转的字节超过一个字节就会跳转到两个字节,

0F80 者就是两个字节,0F上会让你去看两字节的表同样书中会有这个表格

因为E指令有多个指令包含JMP,CALL,LOOP

J是 带偏移地址

上面的是常用的不常用的先不写了

MODR/M 只占一个字节八个位拆开就是下面:

经典的边长指令:

G(寄存器)是由ModR/M 中3,4,5位Reg/Opcode 决定的表格如下

E(寄存器)是由ModR/M中的0,1,2,6,7位Mod和R/M共同决定的:

注:

现在我们查一下一些不常用的指令的指令

0x80~0x83 首先是Imediate Grp 1^1A

1A的意思是下面的表格

1A就是 3,4,5不再代表通用寄存器,而是通用寄存器

所有的带有这些角标的都可以看扩展

Grp 1是下面的表格

具体的所有变长指令的表基本介绍完了,我们试试查找一下

81 22 08 FF

81 Ev,Iz

72 拆成字节是

0111 0010

根据ModR/M

01 110 010

结合 81 MOD 和 R/M 三个可以查出

XXX WORD ptr ds:[EDP+disp8],[immediate]

再用 reg查完整的就是

XOR WORD PTR DS:[EDP+disp8],Iz

这里还有两个未知数不知道 就是后面的数据

disp8是08 Iz就是FF

上面有提过:

当查ModR/M表查到--时,就表示ModR/M不能完全确定寄存器需要再跟一个字节来确定,这个字节就是SIB

例如:

88 84 48

Mov [--][--]+disp32,AL

SIB计算是这下面计算的

然后根据上面的数据可以查出

48

0100 1000

01 001 000

base 000 index 001 Scale 01

硬编码整个过程来说,就是简略的通过查表了解CPU将数据转化成汇编指令的过程。



  • 姹囩紪鍩虹鐭ヨ瘑鍏
    绛旓細涓嬪浘涓篨86鐗堟湰鐨勬寚浠ゆ牸寮忥紝X64鐨勬寚浠ゆ牸寮忓拰X86宸笉澶氬悗闈㈡湁闇瑕佺殑璇濆啀璇︾粏鍐 Istruction Prefixes : 鍙夐」 榛樿浜岃繘鍒舵枃浠舵槸鍓嶇紑鍜屽唴瀹规贩鏉傚湪涓璧峰彧鏈夋満鍣ㄦ墠鑳借瘑鍒尯鍒 浜哄伐鍖哄垎鏂规硶锛歑86鏍煎紡鍥惧凡缁忕粰鎴戜滑鎻愮ず锛屾湁鍥涗釜缁勶紝涓娆℃渶澶氫娇鐢ㄤ竴涓粍 娈靛墠缂鎸囦护鐨勪綔鐢: 淇敼浣跨敤娈靛瘎瀛樺櫒 涓嶅姞鎻愮ず榛樿浣跨敤DS ...
  • 姹囩紪璇█鍩虹鐭ヨ瘑
    绛旓細鏈枃灏嗕粙缁姹囩紪璇█鍩虹鐭ヨ瘑,鍖呮嫭8086CPU鐨勫唴瀛樿闂佹爤鎿嶄綔鏈哄埗绛夈️鍐呭瓨璁块棶灏1000H閫佸叆鍒板瘎瀛樺櫒ds涓,浣跨敤鐨勮鍙ユ槸鈥渕ov ds, 1000H鈥濄傗淸0]鈥濊〃绀轰竴涓唴瀛樺崟鍏,0琛ㄧず鍐呭瓨鍗曞厓鐨勫亸绉诲湴鍧銆傜敤mov鎸囦护璁块棶鍐呭瓨鍗曞厓,鍙互鍦╩ov鎸囦护涓彧缁欏嚭鍗曞厓鐨勫亸绉诲湴鍧,姝ゆ椂,娈靛湴鍧榛樿鍦╠s瀵勫瓨鍣ㄤ腑銆鏍堟搷浣滄満鍒8086CPU...
  • 姹囩紪璇█鍩虹
    绛旓細姹囩紪璇█鏄竴绉嶄綆绾ц瑷,瀹冪洿鎺ラ潰鍚戣绠楁満纭欢,鍏锋湁楂樻晥銆佺伒娲荤瓑鐗圭偣銆傛湰鏂囧皢浠嬬粛姹囩紪璇█鐨鍩虹鐭ヨ瘑,甯姪璇昏呮洿濂藉湴浜嗚В璇ヨ瑷銆瀵诲潃鏂瑰紡姹囩紪璇█涓,甯哥敤鐨勫鍧鏂瑰紡鏈:绔嬪嵆瀵诲潃銆佺洿鎺ュ鍧銆佸瘎瀛樺櫒瀵诲潃銆侀棿鎺ュ鍧銆佺浉瀵瑰鍧绛夈杩愮畻绗︽眹缂栬瑷涓,甯哥敤鐨勮繍绠楃鏈:鍔犮佸噺銆佷箻銆侀櫎銆佷笌銆佹垨銆侀潪銆佸紓鎴栫瓑銆杩涘埗...
  • 姹囩紪璇█鍏ラ棬(浠庨浂寮濮嬪涔犳眹缂栬瑷)
    绛旓細闇瑕佹湁涓瀹氱殑缂栫▼鍩虹 瀛︿範姹囩紪璇█闇瑕佹湁涓瀹氱殑缂栫▼鍩虹锛屾瘮濡備簡瑙鍩烘湰鐨勬暟鎹被鍨嬨佸彉閲忋佸惊鐜佹潯浠惰鍙ョ瓑銆傚鏋滄病鏈夌紪绋嬪熀纭锛屽涔犳眹缂栬瑷鍙兘浼氭瘮杈冨洶闅俱傞渶瑕佹湁涓瀹氱殑鏁板鍩虹 姹囩紪璇█娑夊強鍒颁竴浜涙暟瀛鐭ヨ瘑锛屾瘮濡備簩杩涘埗銆佸崄杩涘埗銆佸崄鍏繘鍒剁瓑銆傚鏋滄病鏈夋暟瀛﹀熀纭锛屽涔犳眹缂栬瑷涔熶細姣旇緝鍥伴毦銆傞渶瑕佹湁鑰愬績鍜屾瘏鍔...
  • C璇█涓姹囩紪鍩虹鐭ヨ瘑
    绛旓細1銆佸紩瑷 闅忕潃淇℃伅鎶鏈殑鍙戝睍鍜岃绠楁満鐭ヨ瘑鐨勬櫘鍙婂簲鐢紝鐜板湪澶ч儴鍒嗛珮鏍¢兘鍦ㄥ紑璁捐绠楁満绋嬪簭璁捐璇剧▼锛屽挨鍏舵槸鍦ㄥ悇涓珮鏍$殑浣庡勾绾у綋涓紑璁惧叿鏈夐珮绾ц瑷鍜屼綆绾ц瑷鍙岄噸鐗规х殑C璇█銆傝屼笖锛孋璇█涔熸槸瀛︾敓杩涗竴姝ュ涔犻珮绾х▼搴忚璁°佹暟鎹粨鏋勫拰缂栬瘧鍘熺悊绛夎绋嬬殑鍩虹锛屾槸杩涗竴姝ュ涔犳繁閫犵殑鏁查棬鐮栵紝鍥犳锛屽悇楂樻牎瀵笴璇█鐨勬暀瀛︿篃...
  • 瀛︿範姹囩紪璇█闇瑕佸摢浜鍩虹鐭ヨ瘑?
    绛旓細姹囩紪璇█鐩存帴涓庣‖浠剁粨鏋勬墦浜ら亾锛屾墍浠ュ涔犳眹缂栬瑷锛屼綘鑷冲皯瑕佹噦寰椾笌涔嬬浉鍏崇殑纭欢鐭ヨ瘑锛屾瘮濡備腑鏂郴缁熴佷笓鐢ㄦā鍧楋紙姣斿涓插彛锛屽畾鏃跺櫒锛岃鏁板櫒锛夈佸瓨鍌ㄥ櫒缁撴瀯銆佹暟鎹荤嚎銆佸湴鍧鎬荤嚎锛涗綘杩橀渶瑕佺啛鎮夋寚浠ょ郴缁燂紱褰撶劧锛屾暟瀛楃數璺煡璇嗕篃鏄繀椤荤殑銆傛眹缂栬瑷缁撴瀯涓嶅楂樼骇璇█閭d箞娓呮櫚锛岀湅璧锋潵姣旇緝绻佺悙鍜屾灟鐕ワ紝鎵浠ラ渶瑕佷笓蹇冨拰闈欏績...
  • 姹囩紪绋嬪簭瀛︿範鎸囧崡
    绛旓細姹囩紪绋嬪簭鍏跺疄鏄渶瀹规槗鐨勮瑷,浣嗗叾闅惧灏遍毦鍦ㄦ眹缂栧繀椤诲纭欢鍗佸垎鐔熸倝,鎵浠ユ垜寤鸿浣犲姹囩紪浠庘滃井鏈哄師鐞嗏濆璧,鍥犱负浣犲杩嘕AVA,鎵浠ュ绋嬪簭鍩烘湰鐨鐭ヨ瘑搴旇閮芥瘮杈冪啛鎮変簡銆寰満鍘熺悊瀛︿範寤鸿寤鸿浠庘滃井鏈哄師鐞嗏濆璧,寰満鍘熺悊鍏跺疄璧风偣骞朵笉楂,浣犲彧瑕佸杩涘埗杞崲姣旇緝鐔熸倝(涓嶇啛鎮夊彲浠ュ幓鐪嬬湅),閭d箞涓婃墜骞朵笉闅剧殑,鍙浣犲璁$畻...
  • 姹囩紪璇█涓浜鍩虹鎬鐭ヨ瘑涓嶆槸寰堢悊瑙,澶у甯府蹇檦
    绛旓細鎸囦护MOV BX,AX鐨勬簮鎿嶄綔鏁板睘浜庡瘎瀛樺櫒鐩存帴瀵诲潃锛屾剰鎸囷細鎿嶄綔鏁板氨鍦ㄨ繖涓瘎瀛樺櫒涓傝屾寚浠OV BX,[AX]鐨勬簮鎿嶄綔鏁板睘浜庡瘎瀛樺櫒闂存帴瀵诲潃锛屾剰鎸囷細鎿嶄綔鏁板湪杩欎釜瀵勫瓨鍣ㄦ墍鎸囩殑鍐呭瓨鍗曞厓涓備絾杩欐潯鎸囦护瀛樺湪涓涓緢涓ラ噸鐨勯棶棰橈細AX涓嶈兘浣滀负鍙樺潃瀵勫瓨鍣ㄤ娇鐢紝鎴栬呰AX涓嶆槸鍙樺潃瀵勫瓨鍣ㄣ傚彉鍧瀵勫瓨鍣ㄦ湁涓嬪垪4涓細BX锛氬熀鍧瀵勫瓨鍣 ...
  • 姹囩紪璇█绋嬪簭鏄粈涔
    绛旓細璁$畻鏈虹▼搴忚璁¤瑷鐨勫彂灞,缁忓巻浜嗕粠鏈哄櫒璇█銆姹囩紪璇█鍒伴珮绾ц瑷鐨勫巻绋嬨 1. 鏈哄櫒璇█ 鐢靛瓙璁$畻鏈烘墍浣跨敤鐨勬槸鐢扁0鈥濆拰鈥1鈥濈粍鎴愮殑浜岃繘鍒舵暟,浜岃繘鍒舵槸璁$畻鏈虹殑璇█鐨鍩虹銆傝绠楁満鍙戞槑涔嬪垵,浜轰滑鍙兘闄嶈吹绾″皧,鐢ㄨ绠楁満鐨勮瑷鍘诲懡浠よ绠楁満骞茶繖骞查偅,涓鍙ヨ瘽,灏辨槸鍐欏嚭涓涓蹭覆鐢扁0鈥濆拰鈥1鈥濈粍鎴愮殑鎸囦护搴忓垪浜ょ敱璁$畻鏈...
  • 姹囩紪璇█閮芥湁浠涔
    绛旓細闂浜旓細瀛︿範姹囩紪璇█闇瑕佸摢浜鍩虹鐭ヨ瘑锛 涓嶈楂樼骇璇█鐨勫熀纭,鍞竴闇瑕佺殑鍩虹鏄:寰瀷璁$畻鏈哄師鐞嗙煡璇,鍙湁鍏峰涓瀹氳绠楁満鍘熺悊鐭ヨ瘑鐨勪汉鎵嶈兘鐪熸鐨勭悊瑙f帉鎻℃眹缂栬瑷,澶氬幓鐪嬬湅鍏充簬璁$畻鏈哄唴閮ㄧ‖浠剁殑涔,渚嬪:涓绘澘涓婇兘鏈変粈涔?CPU鍐呴儴缁撴瀯鍙婂叾鍔熻兘绛夌瓑,涓嶉渶瑕佸璁㈠ゥ,鐪嬫渶鑲ゆ祬鐨勫氨鍙互浜 闂鍏細姹囩紪璇█ AX, AL ...
  • 扩展阅读:初学编程必背50个 ... 汉语语法基础知识大全 ... 扫一扫题目出答案 ... c++编程题库100题 ... 学编程最低学历 ... 汇编语言编程100例 ... 编程必背100个代码 ... 知识大全电子版免费 ... 汇编语言入门教程 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网