哪位大侠帮我看看汇编语言的问题
时间:2011-07-08
来源:互联网
工作中遇到一段汇编代码用的是intel 格式的, 然后我想把它移植到 linux下,因为没有学过汇编, 哪位高手帮我看看
vs 下的代码:
unsigned short int lookKbits(unsigned char k)
{
_asm {
mov dl, k
mov cl, 16
sub cl, dl
mov eax, [wordval]
shr eax, cl
}
}
unsigned short int WORD_hi_lo(unsigned char byte_high,unsigned char byte_low)
{
_asm {
mov ah,byte_high
mov al,byte_low
}
}
signed short int get_svalue(unsigned char k)
// k>0 always
// Takes k bits out of the BIT stream (wordval), and makes them a signed value
{
_asm {
xor ecx, ecx
mov cl,k
mov eax,[wordval]
shl eax,cl
shr eax, 16
dec cl
bt eax,ecx
jc end_macro
signed_value:inc cl
mov ebx,[start_neg_pow2]
add ax,word ptr [ebx+ecx*2]
end_macro:
}
}
我自己改的代码,但是报错:
unsigned short int lookKbits(unsigned char k)
{
__asm__(
"mov $k, %dl\\n\\t"
"mov $16, %cl\\n\\t"
"sub %dl, %cl \\n\\t"
"mov $[wordval], %eax\\n\\t"
"shr %cl, %eax\\n\\t");
}
unsigned short int WORD_hi_lo(unsigned char byte_high,unsigned char byte_low)
{
__asm__(
"mov $byte_high,%ah\\n\\t"
"mov $byte_low,%al\\n\\t");
}
signed short int get_svalue(unsigned char k)
// k>0 always
// Takes k bits out of the BIT stream (wordval), and makes them a signed value
{
//__asm__ __volatile__ ("addl %1, %0"
// 8 : "=b"((long)ebx)
// 9 : "a"((long)eax), "b"((long)ebx)
// 10 : "1"
// 11 );
//
__asm__(
"xor %ecx, ecx"
"mov $k , %cl\\n\\t"
"mov $[wordval] ,%eax\\n\\t"
"shl %cl ,%eax\\n\\t"
"shr $16 ,%eax\\n\\t"
"dec %cl\\n\\t"
"bt %eax, %ecx\\n\\t"
"jc end_macro\\n\\t"
signed_value:
"inc %cl"
"mov $[start_neg_pow2],%ebx\\n\\t"
"add w[%ebx+%ecx*2],%ax\\n\\t"
end_macro:)
}
编译器报错:
/tmp/ccWuJy1q.s: Assembler messages:
/tmp/ccWuJy1q.s:27: Error: invalid character '\' in operand 2
/tmp/ccWuJy1q.s:53: Error: invalid character '\' in operand 2
/tmp/ccWuJy1q.s:76: Error: junk `$k' after expression
/tmp/ccWuJy1q.s:76: Error: invalid character '\' in operand 3
vs 下的代码:
unsigned short int lookKbits(unsigned char k)
{
_asm {
mov dl, k
mov cl, 16
sub cl, dl
mov eax, [wordval]
shr eax, cl
}
}
unsigned short int WORD_hi_lo(unsigned char byte_high,unsigned char byte_low)
{
_asm {
mov ah,byte_high
mov al,byte_low
}
}
signed short int get_svalue(unsigned char k)
// k>0 always
// Takes k bits out of the BIT stream (wordval), and makes them a signed value
{
_asm {
xor ecx, ecx
mov cl,k
mov eax,[wordval]
shl eax,cl
shr eax, 16
dec cl
bt eax,ecx
jc end_macro
signed_value:inc cl
mov ebx,[start_neg_pow2]
add ax,word ptr [ebx+ecx*2]
end_macro:
}
}
我自己改的代码,但是报错:
unsigned short int lookKbits(unsigned char k)
{
__asm__(
"mov $k, %dl\\n\\t"
"mov $16, %cl\\n\\t"
"sub %dl, %cl \\n\\t"
"mov $[wordval], %eax\\n\\t"
"shr %cl, %eax\\n\\t");
}
unsigned short int WORD_hi_lo(unsigned char byte_high,unsigned char byte_low)
{
__asm__(
"mov $byte_high,%ah\\n\\t"
"mov $byte_low,%al\\n\\t");
}
signed short int get_svalue(unsigned char k)
// k>0 always
// Takes k bits out of the BIT stream (wordval), and makes them a signed value
{
//__asm__ __volatile__ ("addl %1, %0"
// 8 : "=b"((long)ebx)
// 9 : "a"((long)eax), "b"((long)ebx)
// 10 : "1"
// 11 );
//
__asm__(
"xor %ecx, ecx"
"mov $k , %cl\\n\\t"
"mov $[wordval] ,%eax\\n\\t"
"shl %cl ,%eax\\n\\t"
"shr $16 ,%eax\\n\\t"
"dec %cl\\n\\t"
"bt %eax, %ecx\\n\\t"
"jc end_macro\\n\\t"
signed_value:
"inc %cl"
"mov $[start_neg_pow2],%ebx\\n\\t"
"add w[%ebx+%ecx*2],%ax\\n\\t"
end_macro:)
}
编译器报错:
/tmp/ccWuJy1q.s: Assembler messages:
/tmp/ccWuJy1q.s:27: Error: invalid character '\' in operand 2
/tmp/ccWuJy1q.s:53: Error: invalid character '\' in operand 2
/tmp/ccWuJy1q.s:76: Error: junk `$k' after expression
/tmp/ccWuJy1q.s:76: Error: invalid character '\' in operand 3
作者: myjavamysun 发布时间: 2011-07-08
建议你直接移植编译好的机器码
作者: Areslee 发布时间: 2011-07-08
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28