开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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


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

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

查看: 2529|回复: 33
收起左侧

[闲聊] 有没有学汇编的易友

[复制链接]
结帖率:69% (9/13)
发表于 2022-6-4 15:22:25 | 显示全部楼层 |阅读模式   广东省中山市
学汇编感觉比高级语言还容易理解有没有?
结帖率:96% (24/25)
发表于 2022-6-5 13:42:45 | 显示全部楼层   保留地址
@镜oo月 汇编没有if啊,这个是AsmToE的伪代码,我发的几个是把if转成用汇编表示例子
回复 支持 反对

使用道具 举报

结帖率:30% (6/20)

签到天数: 16 天

发表于 2022-6-5 09:50:44 | 显示全部楼层   江西省九江市
血几把汇编 还不如血GO

点评

粗鲁的汉子   广东省中山市  发表于 2022-6-5 14:58
回复 支持 反对

使用道具 举报

结帖率:96% (24/25)
发表于 2022-6-4 20:52:42 | 显示全部楼层   保留地址
之前研究跳转的时候记的
-------------------------------
.if eax>2
=
cmp eax, 0x02
jbe Label1
-------------------------------
.if eax>=2
=
cmp eax, 0x02
jc Label1
-------------------------------
.if eax<2
=
cmp eax, 0x02
jnc Label1
-------------------------------
.if eax<=2
=
cmp eax, 0x02
jnbe Label1
-------------------------------
.if eax==2
=
cmp eax, 0x02
jne Label1
-------------------------------
.if eax!=2
=
cmp eax, 0x02
je Label1
-------------------------------

点评

汇编我才看一半,还没学到if   广东省中山市  发表于 2022-6-5 08:08
回复 支持 反对

使用道具 举报

结帖率:73% (8/11)

签到天数: 10 天

发表于 2022-6-4 20:05:23 | 显示全部楼层   山西省晋中市
一学就会一练就废
回复 支持 反对

使用道具 举报

结帖率:78% (71/91)

签到天数: 7 天

发表于 2022-6-4 18:47:31 | 显示全部楼层   河北省廊坊市
关于我半天看完半本汇编语言表示,我也觉得挺简单的,但我认为简单只是假象,在连一本书都没看完时不着急发表评价,不然只会被人笑话
回复 支持 反对

使用道具 举报

结帖率:100% (9/9)

签到天数: 17 天

发表于 2022-6-4 18:46:46 | 显示全部楼层   广西壮族自治区崇左市
本帖最后由 项目部006 于 2022-6-4 18:49 编辑
元老 发表于 2022-6-4 18:37
我也在学汇编,再分享一点好不好呀

这个是硬编码, 看这个笔记对你应该没多大帮助.....
因为有些东西你没学过都不知道怎么来的



寄存器顺序
000                001                010                011                100                101                110                111
0                1                2                3                4                5                6                7
al                cl                dl                bl                ah                ch                dh                bh
eax                ecx                edx                ebx                esp                ebp                esi                edi




0000        0001        0010        0011        0100        0101        0110        0111
0                1                2                3                4                5                6                7


1000        1001        1010        1011        1100        1101        1110        1111
8                9                A                B                C                D                E                F






    10 101 100 [内存 + dis32 4个字节偏移]
        m  ch  [esp]
    mov ch, byte ptr ds:[esp+0x78563412]
       




        mod         reg         rm
        11          000         000
        rm类型        寄存器        寄存器/内存
       
        01 = add Ev, Gv
        7B = 0111 1011对应mod
        mod     reg     rm
        01            111            011
        mod 01  = [内存 + 1字节偏移], 由此得出, 这个01(add)是3个字节
        reg 111 = 7号寄存器, edi
        rm  011 = 3号寄存器, [ebx] mod=01, 表示这个是内存
       
        add dword ptr ds:[ebx + 0x9f], edi
        0x9f 转成有符号字节是 -0x61, 所以也可以写成
        add dword ptr ds:[ebx - 0x61], edi
        所以 01 7b 9f 被翻译成 add dword ptr ds:[ebx - 0x61], edi
       
       




ev,eb = 内存
gb,gv = 寄存器


88 mov eb, gb        rm/eb放前面, reg/gb放后面        eb=rm, gb=reg
89 mov ev, gv        rm/ev放前面, reg/gv放后面        ev=rm, gv=reg


8a mov gb, eb        reg放前面, rm放后面
8b mov gv, ev        reg放前面, rm放后面




mod == 11 rm->r  r=寄存器
mod == 00/01/10  rm=m m=内存
mod == 01  [内存 + 1字节偏移]
mod == 10  [内存 + dis32 4个字节偏移]
mov [xx + xx], xx


如果 mod == 00 rm==5(ebp) ebp 变成 dis(32)
       
        38 cmp eb, gb
        mod reg, rm
        01  101  001
        ch   [ecx+dis8]
        cmp byte ptr ds:[ecx+dis8], ch
       
       
       


       
       
        32 xor gb, eb
        mod reg, rm
        xor ah, dl
        11  100 010
        32 e2
       
        30 xor eb, gb
        mod reg, rm
        xor ah, dl
        11  010 100
        30 d4


       
        32 xor gb, eb
        mod reg, rm
        11  011  011
        bl  bl
        xor bl, bl


        29 sub ev, gv
        mod reg, rm
        01  011  101
        ebx  [ebp+dis8]
        sub dword ptr ds:[ebp+dis8], ebx


       
        20 and eb, gb
        mod reg, rm
        10  110  101
        dh   [ebp+dis32]
        and byte ptr ds:[ebp+dis32], dh
               
        sbb edx, dword ptr ds:[ebp+dis8]


        1b sbb gv, ev
        mod reg, rm
        01  010 101
        edx ebp
        sbb edx, dword ptr ds:[ebp+dis8]


        1a sbb gb, eb
        mod gb, eb
        10  011 000  
        bl  [eax+dis32]
               
        sbb byte ptr ds:[eax+dis32], bl
       
[+dis8] edx [edx]
adc dword ptr ds:[edx+dis8], edx
       
        13 adc gv, ev
        mod gv, ev
        01  010 010
[+dis8] edx [edx]
adc dword ptr ds:[edx+dis8], edx
       
       
        08 or eb, gb
        09 or ev, gv
        0a or gb, eb
        0b or gv, ev


        09 or ev, gv
        mod gv, ev
        10  110 110
[+dis32] esi esi




        0a or gb, eb
        mod gb, eb
        01  010 011
[+dis8] dl [bl]
or dl, [ebx+dis8]
or dl, [ebx+0x12]
0a 53 12


        10 df
        10 or eb, gb
        mod eb, gb
        11  011 111
       
[+dis8] dl [bl]
or dl, [ebx+dis8]
or dl, [ebx+0x12]
0a 53 12




       
[+dis32] esi esi


        03 add gv, ev
        mod gv, ev
        00  100 101
        []  esp [ebp]
        add [ebp], esp
       
       
       
       
        88 mov eb, gb
        mod   reg  rm
        11    011  100
        88 dc
       
        8a mov gb, eb  
        mod   reg  rm
        11    100  001
        8a e1
       
           [] dh  ebx
        8a 01 110 011
        8a 73 12
       
       
        mod   reg  rm
           [] dh  ebx
        8a 01 110 011
        8a 73 12
       
        mod   reg  rm
           [] dl  esi
        8a 00 010 110
        8a 16
       
        10 110 110                [内存 + dis32 4个字节偏移]
        m  esi, esi
        mov esi, dword ptr ds:[esi+0x12345678]
       
        01 010 010
    m  edx [edx+0x12]
        mov dword ptr ds:[edx+0x12], edx


        mov byte ptr ds:[esi + 0x12], al
       
       
       
        10 000 111
    m  al [esi+0x78563412]
        mov byte ptr ds:[edi+0x78563412], al
       
        10 101 011
        m  ebp [ebx+0x78563412]
        mov dword ptr ds:[ebx+0x78563412], ebp
       


一条指令可以对应很多种编码
一个编码只能对应一条指令


评分

参与人数 1好评 +1 精币 +3 收起 理由
元老 + 1 + 3 奉上小小红包希望笑纳

查看全部评分

回复 支持 反对

使用道具 举报

结帖率:100% (9/9)

签到天数: 17 天

发表于 2022-6-4 18:45:06 | 显示全部楼层   广西壮族自治区崇左市
元老 发表于 2022-6-4 18:37
我也在学汇编,再分享一点好不好呀

edi, esi, adc,

adc r/m, r/m/i  和add差不多, 就多了一步加cf(进位标志)标志位的值
sbb r/m, r/m/i  和sub差不多, 就多了一步减cf(进位标志)标志位的值



edi,esi
        edi=目标
        esi=源操作数
        movs 两个操作数都只能是内存
movs  b  w  d
movsb        b=byte
movsw        w=word
movsd        d=dword

mov/lea esi, 地址
mov/lea edi, 地址
mov [edi], 数据
mov [esi], 数据
movsd  把esi的值给edi, 执行后edi和esi增加/减少, sb+/-1,sw+/-2,sd+/-4
DF标志位为1则地址减少, DF为0则增加
设置DF标志位使用 STD置1, CLD置0
DF=0 ESI,EDI 自加
DF=1 ESI,EDI 自减
movsd 相当于 mov dword ptr ds:[edi], dword ptr ds:[esi] add/sub edi,4  add/sub esi, 4
movsw 相当于 mov word ptr ds:[edi],  word ptr ds:[esi]  add/sub edi,2  add/sub esi, 2
movsb 相当于 mov byte ptr ds:[edi],  byte ptr ds:[esi]  add/sub edi,1  add/sub esi, 1

执行movsb/movsw/movsd 前需要先给edi和esi赋值, 值为地址
movsb/movsw/movsd 同时操作esi,edi, esi=源, edi=目标
movsd =
        {
                        CLD        DF=0
                mov dword ptr ds:[edi], dword ptr ds:[esi]
                add edi, 4
                add esi, 4
               
                        STD DF=1
                mov dword ptr ds:[edi], dword ptr ds:[esi]
                sub edi, 4
                sub esi, 4
        }
       
rep  重复前缀

mov ecx, 0x10
rep movsd  执行ecx(0x10)次movsd, ecx每次-1


stos b/w/d  将al/ax/eax 的值给[di/edi]
mov/lea edi, 地址
stosd   执行后edi增加/减少, sb+/-1, sw+/-2, sd+/-4
跟movs 指令一样, 看DF标志位来增加或减少
rep stosd  执行ecx(0x10)stosd, ecx每次-1



我稍微看了一下, 感觉好像看不懂了....
回复 支持 反对

使用道具 举报

结帖率:100% (9/9)

签到天数: 17 天

发表于 2022-6-4 18:43:58 | 显示全部楼层   广西壮族自治区崇左市
元老 发表于 2022-6-4 18:37
我也在学汇编,再分享一点好不好呀

标志位

EFLAG标志寄存器, 一个16个标志位, 现在用到9个标志位, 6个保留
01=保留
03=保留       
05=保留       

以下标志为第一组, 运算结果标志, 00-06
00=CF         = 进位标志, 运算结果的最高位, 产生进位或借位, CF = 1, 否则CF=0
                        运算后结果超过寄存器最大值,或者寄存器减去某个值小于0, CF=1,
02=PF        = 奇偶标志, 运算结果中1的个数为偶数, PF=1, 否则PF=0
                        1*2=0010,1的个数=奇数,PF=0, 1*3=0011, 1的个数是偶数, PF=1
04=AF        = 辅助进位标志, 整体发生进位或者借位  AF=1 否则AF=0, 低字节向高字节进位或者借位
                        低半字节向高半字节进位或借位, AF=1, 否则AF=0,
                        0x100-0x1=0x00ff
                        0000 0001 0000 0000 0x0100
                  - 0000 0000 0000 0001 0x0001 向高8位借了一位, AF=1
                  = 0000 0000 1111 1111 0x00ff
                  
                        0xff+0x81 = 0x0180
                        0000 0000 1111 1111 0x00ff
                  + 0000 0000 1000 0001 0x0081
                  = 0000 0001 1000 0000 0x0180

06=ZF        = 零标志位, 运算结果为0, 则ZF=1,否则ZF=0
                        xx-xx=0, xor eax,eax
07=SF        = 符号标志(sign flag) , 运算结果的符号位最高位是1, 则SF=1, 否则SF=0
                        如果有符号数, SF=0 代表正数, SF=1 代表负数
11=OF        = 溢出标志, 有符号数加减运算是否引起溢出, 大于0x7FFF FFFF || 小于 0x8000 0000, 都会置1

07-15        = 第二组, 状态控制标志
08=TF        = 追踪标志(Trap Flag), 单步执行用的标志位
09=IF        = 中断允许标志(Interrupt - enable Flag) STI =置1, CLI=置0
10=DF        = 方向标志(Direction Flag)  STD=置1, CLD=置0


12=保留       
13=保留       
14=保留       
15=保留       


0000 1010 1001 0010

回复 支持 反对

使用道具 举报

结帖率:78% (71/91)

签到天数: 7 天

发表于 2022-6-4 18:37:52 | 显示全部楼层   河北省廊坊市
福仔 发表于 2022-6-4 17:58
记一些单词就好记了, 没有必要都记哪个跳转判断哪个标志位

J = 跳转

我也在学汇编,再分享一点好不好呀
回复 支持 反对

使用道具 举报

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

本版积分规则 致发广告者

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

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

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