开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 280|回复: 7
打印 上一主题 下一主题
收起左侧

[已解决] 有没有大佬帮我把这段代码转成汇编代码

 关闭 [复制链接]
结帖率:83% (5/6)
跳转到指定楼层
楼主
发表于 2025-4-18 11:16:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式   广东省深圳市
50精币
这是一个24位图上下翻转的易语言代码,我自己写的
因为一次性要处理好几万张图片翻转操作,所以要求很高的效率;
所以有没有大佬帮忙转成汇编代码,本人实在看不懂汇编的那些玩意!


  
子程序名返回值类型公开备 注
上下翻转_BMP  
参数名类 型参考可空数组备 注
局_图字节集必须是24位BMP图像
变量名类 型静态数组备 注
局_宽度整数型 
局_高度整数型 
局_半高度整数型 
局_每行字节数整数型 
i整数型 
j整数型 
k整数型 
局_宽度 = 取字节集数据 (局_图, #整数型, 19)
局_每行字节数 = 位与 (局_宽度 × 3 + 3, -4)
' LONG biWidth; // 位图的宽度,以像素为单位(18-21字节)
局_高度 = 取字节集数据 (局_图, #整数型, 23)
局_半高度 = 局_高度 ÷ 2
' LONG biHeight; // 位图的高度,以像素为单位(22-25字节)
变量循环首 (1, 局_半高度, 1, i)
变量循环首 (1, 局_每行字节数, 1, j)
k = 局_图 [局_每行字节数 � (i - 1) + j + 54]
局_图 [局_每行字节数 � (i - 1) + j + 54] = 局_图 [局_每行字节数 � (局_高度 - i) + j + 54]
局_图 [局_每行字节数 � (局_高度 - i) + j + 54] = k
变量循环尾 ()
变量循环尾 ()

最佳答案

查看完整内容

你可以先把它改写成C代码: [md]``` struct t { int i; int n; char image[2]; }; _stdcall void BMPfun(struct t **s) { char *image = (char *)&(*s)->image; int i = *(int *)&image[18]; int j = (i * 3 + 3) & -4; int k = *(int *)&image[22]; int m = k / 2; for (int n1 = 0; n1 < m; n1++) { for (int n2 = 0; n2 < j; n2++) { int t = image[j * n1 + n2 + 54]; image[j * n1 + n2 + 54] = image[ ...

回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至 源码区 可获得加分喔。
友情提醒:本版被采纳的主题可在 申请荣誉值 页面申请荣誉值,获得 1点 荣誉值,荣誉值可兑换荣誉会员、终身vip用户组。
快捷通道:申请荣誉值无答案申请取消悬赏投诉有答案未采纳为最佳

结帖率:100% (1/1)
沙发
发表于 2025-4-18 11:16:17 | 只看该作者   浙江省温州市
你可以先把它改写成C代码:
struct t {
    int i;
    int n;
    char image[2];
};

_stdcall void BMPfun(struct t **s)
{
    char *image = (char *)&(*s)->image;
    int i = *(int *)&image[18];
    int j = (i * 3 + 3) & -4;
    int k = *(int *)&image[22];
    int m = k / 2;
    for (int n1 = 0; n1 < m; n1++)
    {
        for (int n2 = 0; n2 < j; n2++)
        {
            int t = image[j * n1 + n2 + 54];
            image[j *  n1 + n2 + 54] = image[j * (k - n1 - 1) + n2 + 54];
            image[j * (k - n1 - 1) + n2 + 54] = t;
        }
    }
}


然后用C的编译器输出汇编代码:
    .file   "0.c"
    .intel_syntax noprefix
    .text
    .globl  _BMPfun@4
    .def    _BMPfun@4;  .scl    2;  .type   32; .endef
_BMPfun@4:
    push    ebp
    mov ebp, esp
    push    edi
    xor edi, edi
    push    esi
    mov esi, 2
    push    ebx
    sub esp, 20
    mov eax, DWORD PTR [ebp+8]
    mov DWORD PTR [ebp-16], 0
    mov ebx, DWORD PTR [eax]
    mov eax, DWORD PTR [ebx+26]
    lea ecx, [eax+1]
    mov eax, DWORD PTR [ebx+30]
    lea ecx, [ecx+ecx*2]
    and ecx, -4
    cdq
    idiv    esi
    mov DWORD PTR [ebp-32], eax
    mov eax, DWORD PTR [ebx+30]
    dec eax
    imul    eax, ecx
    mov DWORD PTR [ebp-24], eax
L2:
    mov edx, DWORD PTR [ebp-32]
    cmp DWORD PTR [ebp-16], edx
    jge L1
    mov eax, DWORD PTR [ebp-24]
    lea esi, [edi+ebx]
    mov DWORD PTR [ebp-20], 0
    lea edx, [eax+ebx]
L5:
    inc esi
    inc edx
    cmp DWORD PTR [ebp-20], ecx
    jge L8
    mov al, BYTE PTR [esi+61]
    inc DWORD PTR [ebp-20]
    mov BYTE PTR [ebp-25], al
    mov al, BYTE PTR [edx+61]
    mov BYTE PTR [esi+61], al
    mov al, BYTE PTR [ebp-25]
    mov BYTE PTR [edx+61], al
    jmp L5
L8:
    inc DWORD PTR [ebp-16]
    add edi, ecx
    sub DWORD PTR [ebp-24], ecx
    jmp L2
L1:
    add esp, 20
    pop ebx
    pop esi
    pop edi
    pop ebp
    ret 4
    .ident  "GCC: (x86_64-posix-seh, Built by MinGW-Builds project) 11.4.0"


最后修改一下,让它能放到易语言中运行,结果得到的就是你说的汇编代码:
  
子程序名返回值类型公开备 注
上下翻转_BMP_汇编  
参数名类 型参考可空数组备 注
局_图字节集必须是24位BMP图像
置入代码 ({ 49, 255, 190, 2, 0, 0, 0, 131, 236, 20, 139, 69, 8, 199, 69, 240, 0, 0, 0, 0, 139, 24, 139, 67, 26, 141, 72, 1, 139, 67, 30, 141, 12, 73, 131, 225, 252, 153, 247, 254, 137, 69, 224, 139, 67, 30, 72, 15, 175, 193, 137, 69, 232, 139, 85, 224, 57, 85, 240, 125, 56, 139, 69, 232, 141, 52, 31, 199, 69, 236, 0, 0, 0, 0, 141, 20, 24, 70, 66, 57, 77, 236, 125, 23, 138, 70, 61, 255, 69, 236, 136, 69, 231, 138, 66, 61, 136, 70, 61, 138, 69, 231, 136, 66, 61, 235, 226, 255, 69, 240, 1, 207, 41, 77, 232, 235, 192, 201, 194, 4, 0 })
' xor edi, edi
' mov esi, 2
' sub esp, 20
' mov eax, DWORD PTR [ebp+8]
' mov DWORD PTR [ebp-16], 0
' mov ebx, DWORD PTR [eax]
' mov eax, DWORD PTR [ebx+26]
' lea ecx, [eax+1]
' mov eax, DWORD PTR [ebx+30]
' lea ecx, [ecx+ecx*2]
' and ecx, -4
' cdq
' idiv esi
' mov DWORD PTR [ebp-32], eax
' mov eax, DWORD PTR [ebx+30]
' dec eax
' imul eax, ecx
' mov DWORD PTR [ebp-24], eax
' L2:
' mov edx, DWORD PTR [ebp-32]
' cmp DWORD PTR [ebp-16], edx
' jge L1
' mov eax, DWORD PTR [ebp-24]
' lea esi, [edi+ebx]
' mov DWORD PTR [ebp-20], 0
' lea edx, [eax+ebx]
' L5:
' inc esi
' inc edx
' cmp DWORD PTR [ebp-20], ecx
' jge L8
' mov al, BYTE PTR [esi+61]
' inc DWORD PTR [ebp-20]
' mov BYTE PTR [ebp-25], al
' mov al, BYTE PTR [edx+61]
' mov BYTE PTR [esi+61], al
' mov al, BYTE PTR [ebp-25]
' mov BYTE PTR [edx+61], al
' jmp L5
' L8:
' inc DWORD PTR [ebp-16]
' add edi, ecx
' sub DWORD PTR [ebp-24], ecx
' jmp L2
' L1:
' leave
' ret 4

评分

参与人数 1荣誉 +1 收起 理由
笨潴 + 1 热心帮助他人,荣誉+1,希望继续努力(*^__^*) 嘻嘻!

查看全部评分

回复

使用道具 举报

结帖率:98% (108/110)

签到天数: 10 天

板凳
发表于 2025-4-18 11:21:30 | 只看该作者   湖北省武汉市
其实可以用C++单独写一个函数  然后整个函数复制出来置入代码   
回复

使用道具 举报

结帖率:96% (51/53)

签到天数: 14 天

地板
发表于 2025-4-18 12:51:58 | 只看该作者   河北省廊坊市
这两个问号 一黑一红是什么玩意?
回复

使用道具 举报

结帖率:83% (5/6)

签到天数: 11 天

地下
 楼主| 发表于 2025-4-18 13:40:20 | 只看该作者   广东省深圳市
就想改个名字 发表于 2025-4-18 11:21
其实可以用C++单独写一个函数  然后整个函数复制出来置入代码

主要是不会啊!
回复

使用道具 举报

结帖率:83% (5/6)

签到天数: 11 天

6
 楼主| 发表于 2025-4-18 13:41:46 | 只看该作者   广东省深圳市
cunanhai 发表于 2025-4-18 12:51
这两个问号 一黑一红是什么玩意?

乘号啊!你复制下来不就看得清楚了~
回复

使用道具 举报

签到天数: 14 天

7
发表于 2025-4-18 13:45:08 | 只看该作者   重庆市重庆市
回复

使用道具 举报

签到天数: 1 天

8
发表于 2025-4-18 14:13:54 | 只看该作者   广西壮族自治区南宁市
  
子程序名返回值类型公开备 注
上下翻转_BMP  
参数名类 型参考可空数组备 注
局_图字节集必须是24位BMP图像
变量名类 型静态数组备 注
局_宽度整数型 
局_高度整数型 
局_半高度整数型 
局_每行字节数整数型 
i整数型 
j整数型 
p整数型 
' 注意 汇编的代码 写好后 就不能修改代码 哪怕 增加一个变量都不行
p = 取变量数据地址 (局_图)
局_宽度 = 取字节集数据 (局_图, #整数型, 19)
局_每行字节数 = 位与 (局_宽度 × 3 + 3, -4)
局_高度 = 取字节集数据 (局_图, #整数型, 23)
局_半高度 = 局_高度 ÷ 2
变量循环首 (1, 局_半高度, 1, i)
变量循环首 (1, 局_每行字节数, 1, j)
置入代码 ({ 139, 69, 244, 137, 199, 139, 85, 232, 74, 247, 226, 3, 69, 228, 131, 192, 53, 139, 117, 252, 138, 28, 6, 137, 193, 137, 248, 139, 125, 240, 43, 125, 232, 247, 231, 3, 69, 228, 131, 192, 53, 138, 60, 6, 136, 28, 6, 136, 60, 14 })
变量循环尾 ()
变量循环尾 ()


i支持库列表   支持库注释   
spec特殊功能支持库




补充内容 (2025-4-18 14:14):
部分汇编化后(重要部分) 5.3711ms 没汇编 81.5651ms
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:[email protected]
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表