1. 程式人生 > >一道組合語言與c語言匹配的死懟題

一道組合語言與c語言匹配的死懟題

這裡用的都是AT&T語法

1.引用暫存器要在暫存器號前加百分號%,如“movl %eax, %ebx”。

2.運算元排列是從源(左)到目的(右),如“movl %eax(源), %ebx(目的)”

3.使用立即數,要在數前面加符號$, 如“movl $0x04, %ebx”

或者:

para = 0x04

movl $para, %ebx

指令執行的結果是將立即數04h裝入暫存器ebx。

4.符號常數直接引用 如

value: .long 0x12a3f2de

movl value , %ebx

指令執行的結果是將常數0x12a3f2de裝入暫存器ebx。

引用符號地址在符號前加符號$, 如“movl $value, % ebx”則是將符號value的地址裝入暫存器ebx。

5. 運算元的長度

運算元的長度用加在指令後的符號表示b(byte, 8-bit), w(word, 16-bits), l(long, 32-bits),如“movb %al, %bl”,“movw %ax, %bx”,“movl %eax, %ebx ”。

如果沒有指定運算元長度的話,編譯器將按照目標運算元的長度來設定。比如指令“mov %ax, %bx”,由於目標運算元bx的長度為word,那麼編譯器將把此指令等同於“movw %ax, %bx”。

死磕的一道題 畢竟彙編程式碼太難懂了 在題庫中尋找了好久才發現這道簡單的題 首先是要我將彙編程式碼和C語言的程式碼功能相對應 這個總共給了四個彙編程式碼 當然可以死懟了  但是還是要將就點方法 彙編不好懂就先看c唄 左面的c的確很好懂 分析一下 發現有兩個迴圈 一個直接輸出整出b%a 還有一個是比較大小進行輸出 然後再看看彙編程式碼  嗯 迴圈好像很容易看出來的嘛 箭頭回指的應該就是迴圈了 應該沒得錯 於是看看這程式碼就先從簡單的第四個分析吧

第四個中有個 sar指令  百度說:SAR 算術右移.(每位右移, 低位進 CF, 高位不變) SARL k, D  即將D算術右移k位。 還有個idiv指令 她還說:IDIV 整數除法. 這就明顯了嘛  這裡雖然不太懂 %ebp bp是儲存器指標用來存取堆疊的指標也就是sp ebp是32位的儲存器指標 這裡百度了一下應該就是差不多還是一樣的意思 原作者是這樣說的:AT&T彙編的暫存器   Intel彙編不用加 

然後我就發現mov 12(%ebp),%eax 這個是啥東西 不懂  好像是說的12是偏移 用intel彙編就是

mov eax,[ebp+12] 大概就是說 將ebp加上12所指的的資料傳給eax 分析半天還是不知道他是如何實現 b%a 的

我就猜這個就是整除吧 畢竟有個idiv 那對應的就是這個C語言了

然後就當然找C對應的 彙編了 因為這兩個沒有迴圈 也就是說 C應該是剩下的組合語言中沒有回指箭頭的另外一個圖

也就是這個圖了

當中JLE/JNG 小於或等於轉移.也就是判斷然後轉移到下面的程式 與C語言中的if很像嘛 然後又是這種看不懂的東西

JNS 符號位為 "0" 時轉移.

“$”是組合語言中的一個預定義符號,等價於當前正彙編到的段的當前偏移值。

指令“jmp $+3”表示要向前跳轉到距離這條指令3個位元組的地方。若是“jmp $-3”,則表示要向後跳轉到距離這條指令3個位元組的地方。

唉 真的是看不懂 於是剩下的兩個就猜唄 反正就兩個對應兩個 然後就猜對了 正確答案:BCDA