首页
社区
课程
招聘
[旧帖] [求助]移位指令和无条件跳转:不怎么理解 0.00雪花
发表于: 2011-4-18 21:32 1271

[旧帖] [求助]移位指令和无条件跳转:不怎么理解 0.00雪花

2011-4-18 21:32
1271
不知道为什么这两章学的有点模糊(中山15~16集:移位指令和无条件跳转)

就是感觉记不住(没有彻底的理解),老忘了

不像前面几章,我可以想想在高级语言中是怎么写的,然后反着学

但这两章,不知道在高级语言中是什么样子

就比如说:

移位指令在高级语言中是怎样书写的,为什么要移位,在什么时候才需要用到移位

还有无条件跳转:是怎样书写的,为什么要跳转,什么时候才需要用到无条件跳转

这两个问题问的可能有点奇怪……

当然还是希望有高人指点

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 69
活跃值: (30)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
移位指令在C++裡的寫法:

int n = 100; // 01100100

// 01100100 shift left 1 bit is 11001000
int m = n << 1; // 11001000

// 01100100 shift right 2 bits is 00011001
int p = n >> 2; // 00011001

結果(十進位):
n: 100
m: 200
p: 25

至於無條件跳轉的話,一般高級語言是不建議使用這個的。
在C++裡,無條件跳轉是用goto,我在這裡舉個例子。

bool myfunc(void)
{

bool result = false;
FILE* f = fopen("test.txt", "rt");

if ( ... ) goto onexit;

// some code here

if ( ... ) goto onexit;

// some code here

result = true;

onexit: // 這裡放一個Label
fclose(f);
return result;

}
2011-4-18 21:51
0
雪    币: 37
活跃值: (80)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
======================================

先谢谢了

这书写格式看出来就是爽

但我想在问一句:什么时间才需要用到

假设我现在会所有的语言,我想用 C++  写一个程序,在编写什么的时候才需要用到这个指令

这样写可能有点糊

例如:ADD

当我的编程时,想用 100+100 的时候就会用到了

但移位指令是编程的什么时候会用到,希望高人解释解释
(不理解的话,就相当于死记硬背,死记硬背就没发贯通了)
2011-4-18 22:01
0
雪    币: 41
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不知道楼主看过王爽的那本《汇编语言》没有,感觉说的比较详细、易懂
2011-4-18 22:05
0
雪    币: 37
活跃值: (80)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
================================

哦!!!
无条件跳转 原来是用在判断语句上的啊。。。

非常感谢
2011-4-18 22:06
0
雪    币: 37
活跃值: (80)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
不好意思 。。没有

我入手的就是中山的

有时间我会看看的,也谢谢你的帮助
2011-4-18 22:08
0
雪    币: 69
活跃值: (30)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
我上一次看見bit shift是在一個叫作Local Binary Pattern(LBP)的演算法裡。
所以我在這裡也用它來舉個例子。

假設,對於灰階像素X有八個相鄰的像素,分別是A~H,如下所示:
A H G
B X F
C D E

我們將這八個相鄰的像素A~H與中間的像素X做比較,
如果相鄰像素比X大的話,則用1來表示,否則為0。
舉例,X為5,A~H分別為1~8的話:
1 8 7
2 5 6
3 4 5

運算後會得到:
0 1 1
0 X 1
0 0 0

如此A~Z分別為 0 0 0 0 0 1 1 1,因為正好是八個位元,
所以可以把它當成是一個8bit的整數,像這個00000111就是7。

我們可以舉其他例子,比如結果可能會是01110000(十進位是112):
0 0 0
1 X 0
1 1 0
或者00001110(十進位是14):
0 0 1
0 X 1
0 0 1

我這裡想說的是,在LBP的論文中,認為不管是00000111、
01110000或者00001110所代表的義意是相同的:它們具有相同的紋理。
所以論文裡做了一個步驟:shift(loop)直到最小。
比如說,00000111、01110000、00001110都會得到00000111這個結果。
ps. 0~255所有數字都shift到最小的話,好像會剩下36組數字。

因為懶得再舉例,所以直接把我寫過程式碼的一段貼上來:
/* calculate LBP */

for (int x = 0; x < width; x++)
{
	for (int y = 0; y < height; y++)
	{
		double* tempaddr = &temp[(left + x) * tempHeight + (top + y)];
		uint8_t& outval = output[x * height + y] = 0;
		for (int i = 0; i < 8; i++) // compare width center
		{
			outval <<= 1;
			if (tempaddr[offset[i]] > tempaddr[0]) outval |= 1;
		}

		uint8_t rotate = outval;
		for (int i = 0; i < 7; i++) // rotate to minimum
		{
			rotate = uint8_t(rotate << 1) | uint8_t(rotate >> 7);
			if (rotate < outval) outval = rotate;
		}
	}
}
2011-4-19 00:06
0
雪    币: 143
活跃值: (61)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
8
楼上大侠说得很清楚好~~不过,我建议你不要管这么多,因为我都是代码需要了,才发现用处。例如goto,其实是万能跳~只是不建议这样做而已。
还有在while ,for ,do ,while ,switch 里,都有jmp(编译器决定)

位移,很多时候是用来加密、解密的,但是不止能这么用,我们要提取几个特定的bit,会用到位移(LOWORD,GET_X_PARAM...)
……特别好玩的是,(m左移n位)等于(m×2^n),(m右移n位)等于(m÷2^n),听说这样算能比直接乘除快很多倍~
2011-4-19 00:59
0
游客
登录 | 注册 方可回帖
返回
//