关于内嵌汇编的一个疑问

guantongxin 2010-07-05 02:50:35

#include "stdio.h"
#include "stdlib.h"
void test(char * a)
{

__asm{

mov esi,a
mov ah,[esi]
mov al,[esi+1]
mov [esi],al ;代码1
mov [esi+1],ah
mov [esi+2],'\0'

}
printf("%s",a);
}

void main()
{

char * a = (char *)malloc(3*sizeof(char *));
a = "sa";
test(a);

}

执行的时候 代码1 处会报错,不让我写入,不是很明白,以为下面这段也是指针就可以写入

void addArr(unsigned int* arr,unsigned int* arr2)
{
__asm{
mov ecx, NUM
mov esi, arr
mov edi, arr2
mov eax, ecx
shl eax, 2
add esi, eax
add edi, eax
clc
_add:
sub esi, 4
sub edi, 4
mov eax, [edi]
adc [esi],eax
loop _add
}

}


请哪位高手帮帮忙
...全文
156 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
guantongxin 2010-07-06
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 guantongxin 的回复:]
引用 6 楼 huaxiamoyun 的回复:
一楼高手
char * a = (char *)malloc(3*sizeof(char *));
//经典错误
//a = "sa";
能否麻烦你解释这是为啥吗


我觉得这个应该是这样解释,“sa”这样字符串有一个const属性,赋值给a是没有问题的,但是它不能进行更改,我在函数里面要交换两个字符的位置,就报错了。
[/Quote]

而且 这样做的话,前面的malloc也没有用的。分配的地址都没用上
guantongxin 2010-07-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 huaxiamoyun 的回复:]
一楼高手
char * a = (char *)malloc(3*sizeof(char *));
//经典错误
//a = "sa";
能否麻烦你解释这是为啥吗
[/Quote]

我觉得这个应该是这样解释,“sa”这样字符串有一个const属性,赋值给a是没有问题的,但是它不能进行更改,我在函数里面要交换两个字符的位置,就报错了。
huaxiamoyun 2010-07-05
  • 打赏
  • 举报
回复
还得多多学习 努力 努力
huaxiamoyun 2010-07-05
  • 打赏
  • 举报
回复
一楼高手
char * a = (char *)malloc(3*sizeof(char *));
//经典错误
//a = "sa";
能否麻烦你解释这是为啥吗
guantongxin 2010-07-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 huaxiamoyun 的回复:]
你好 我是第一次见这么写程序 当然这只是我见识的少
我感觉你的问题好像方的地反不对了
因为你这是C、c++语言与汇编语言混用的程序啊
下面是我的一点儿看法 不知能否帮助你
mov [esi],al 前者是地址 是一个字符的地址 后者是字符 怎么是地址写入呢
而第二段程序 真的没看出来 哪一个语句与代码1出能对比来看
不好意思 本人愚钝
[/Quote]
这个是汇编中的间接引用啊。
guantongxin 2010-07-05
  • 打赏
  • 举报
回复
[Quote=引用楼主 guantongxin 的回复:]

#include "stdio.h"
#include "stdlib.h"
void test(char * a)
{

__asm{

mov esi,a
mov ah,[esi]
mov al,[esi+1]
mov [esi],al ;代码1
mov [esi+1],ah
mov [esi+2],'\0'

}
……
[/Quote]
不好意思 ,大哥 一不小心分给错了,以后有机会我会补上的。
guantongxin 2010-07-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 oyster2008 的回复:]
C/C++ code
#include "stdio.h"
#include "stdlib.h"
void test(char * a)
{

__asm{

mov esi,a
mov ah,[esi]
mov al,[esi+1]
mov [esi],al ;代码1
mov [esi+1],ah
mov [esi+2],'\0'

}
printf("%s……
[/Quote]

太感谢了,我学的不到家啊 ,还得回去看看书啊。呵呵
huaxiamoyun 2010-07-05
  • 打赏
  • 举报
回复
你好 我是第一次见这么写程序 当然这只是我见识的少
我感觉你的问题好像方的地反不对了
因为你这是C、c++语言与汇编语言混用的程序啊
下面是我的一点儿看法 不知能否帮助你
mov [esi],al 前者是地址 是一个字符的地址 后者是字符 怎么是地址写入呢
而第二段程序 真的没看出来 哪一个语句与代码1出能对比来看
不好意思 本人愚钝
oyster2008 2010-07-05
  • 打赏
  • 举报
回复
#include "stdio.h"
#include "stdlib.h"
void test(char * a)
{

__asm{

mov esi,a
mov ah,[esi]
mov al,[esi+1]
mov [esi],al ;代码1
mov [esi+1],ah
mov [esi+2],'\0'

}
printf("%s",a);
}

void main()
{

char * a = (char *)malloc(3*sizeof(char *));
//经典错误
//a = "sa";
strcpy(a,"sa");
test(a);
free(a);
}

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧