鱼C论坛

 找回密码
 立即注册
查看: 3786|回复: 5

[已解决]零基础汇编实验八疑问

[复制链接]
发表于 2021-1-25 22:28:23 | 显示全部楼层 |阅读模式
5鱼币
问题标红
{
        assume cs:codesg
        codesg segment
                mov ax,4c00h
                int 21h
        start:        mov ax,0
                s:        nop
                        nop
                       
                        mov di,offset s
                        mov si,offset s2
                        mov ax,cs:[si]
                        mov cs:[di],ax
               
                s0:        jmp short s
               
                s1:        mov ax,0                        
                        int 21h
                        mov ax,0
                       
                s2:jmp short s1
                        nop
        codesg ends
        end start
;                mov di,offset s        (s的偏移地址8)
;                mov si,offset s2  (s2的偏移地址20)
;                mov ax,cs:[si]        (cs:si指向的值赋值给ax)
;                mov cs:[di],ax        (ax的赋值给cs:di)
;总感觉这里缺少一句,mov di,offset s 这样写的话是不是短暂的关联在一起。cs:di 表示的就是s标号
;                jmp short s                 (回跳标号s处)
;                s执行的是s2的指令        (s2的),而s2的机器编码是EBF6
;cpu不管s2处的标号s1,执行的是机器编码?
}
最佳答案
2021-1-25 22:28:24
;源代码
assume cs:codesg
codesg segment
        mov ax,4c00h
        int 21h
start:        
        mov ax,0
        s:
        nop
        nop
        
        ;这段代码是将 s2 处的两个字节复制到 s
        ;如你所说,s2处的数据是 EB F6
        ;执行这段代码后,s处的nop nop 就变成了 EB F6
        ;你说的缺少一句是什么意思?该写一句什么?
        mov di,offset s
        mov si,offset s2
        mov ax,cs:[si]
        mov cs:[di],ax
           
        s0:
        ;跳转到s,这时,s处的代码已经变成了 EB F6
        jmp short s
   
        s1:
        mov ax,0                        
        int 21h
        mov ax,0
           
        s2:
        jmp short s1
        nop
codesg ends
end start 
;这是原始的反汇编代码
;s 的地址为 0008,内容为 90 90,即 nop nop
;s2的内容为 EB F6 , 反汇编码为 JMP 0018 其中 0018为s1的地址
;再进一步看 EB F6为什么会被翻译成 JMP 0018
;因为 EB 是 JMP near 指令的二进制码,后面接一个字节的立即数,这个立即数 F6 是一个地址,
;事实上,这里的F6是个相对地址,是 JMP near 的下一条指令的相对地址。
;EB F6 的下一条指令是 NOP[90],地址为 0022,因此 EB F6 翻译成汇编代码实际应为 JMP 0022+F6
;F6换算成十进制是 -10, 再换算成带符号的十六进制是 -A 0022+F6 = 0022 - 000A = 0018
;所以 EB F6 反汇编后变成了 JMP 0018
-u
0C33:0005 B80000        MOV     AX,0000
0C33:0008 90            NOP
0C33:0009 90            NOP
0C33:000A BF0800        MOV     DI,0008
0C33:000D BE2000        MOV     SI,0020
0C33:0010 2E            CS:
0C33:0011 8B04          MOV     AX,[SI]
0C33:0013 2E            CS:
0C33:0014 8905          MOV     [DI],AX
0C33:0016 EBF0          JMP     0008
0C33:0018 B80000        MOV     AX,0000
0C33:001B CD21          INT     21
0C33:001D B80000        MOV     AX,0000
0C33:0020 EBF6          JMP     0018
0C33:0022 90            NOP
0C33:0023 06            PUSH    ES
0C33:0024 81F90002      CMP     CX,0200
-
;下面是执行完指令MOV CS:[DI],AX 后的反汇编代码
;s 的地址为 0008,内容已经变成了EB F6,说明将成功将[s2]的内容复制到了[s]
;下面分析一下 EB F6 为什么会被翻译成 JMP 0000
;与上面的分析相同,先找 EB F6 的下一条指令的地址为 000A
;EB F6 = JMP 000A + F6 = JMP  000A - 000A = JMP 0000
-u0005
0C33:0005 B80000        MOV     AX,0000
0C33:0008 EBF6          JMP     0000
0C33:000A BF0800        MOV     DI,0008
0C33:000D BE2000        MOV     SI,0020
0C33:0010 2E            CS:
0C33:0011 8B04          MOV     AX,[SI]
0C33:0013 2E            CS:
0C33:0014 8905          MOV     [DI],AX
0C33:0016 EBF0          JMP     0008
0C33:0018 B80000        MOV     AX,0000
0C33:001B CD21          INT     21
0C33:001D B80000        MOV     AX,0000
0C33:0020 EBF6          JMP     0018
0C33:0022 90            NOP
0C33:0023 06            PUSH    ES
0C33:0024 81F90002      CMP     CX,0200
-

最佳答案

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-1-25 22:28:24 | 显示全部楼层    本楼为最佳答案   
;源代码
assume cs:codesg
codesg segment
        mov ax,4c00h
        int 21h
start:        
        mov ax,0
        s:
        nop
        nop
        
        ;这段代码是将 s2 处的两个字节复制到 s
        ;如你所说,s2处的数据是 EB F6
        ;执行这段代码后,s处的nop nop 就变成了 EB F6
        ;你说的缺少一句是什么意思?该写一句什么?
        mov di,offset s
        mov si,offset s2
        mov ax,cs:[si]
        mov cs:[di],ax
           
        s0:
        ;跳转到s,这时,s处的代码已经变成了 EB F6
        jmp short s
   
        s1:
        mov ax,0                        
        int 21h
        mov ax,0
           
        s2:
        jmp short s1
        nop
codesg ends
end start 
;这是原始的反汇编代码
;s 的地址为 0008,内容为 90 90,即 nop nop
;s2的内容为 EB F6 , 反汇编码为 JMP 0018 其中 0018为s1的地址
;再进一步看 EB F6为什么会被翻译成 JMP 0018
;因为 EB 是 JMP near 指令的二进制码,后面接一个字节的立即数,这个立即数 F6 是一个地址,
;事实上,这里的F6是个相对地址,是 JMP near 的下一条指令的相对地址。
;EB F6 的下一条指令是 NOP[90],地址为 0022,因此 EB F6 翻译成汇编代码实际应为 JMP 0022+F6
;F6换算成十进制是 -10, 再换算成带符号的十六进制是 -A 0022+F6 = 0022 - 000A = 0018
;所以 EB F6 反汇编后变成了 JMP 0018
-u
0C33:0005 B80000        MOV     AX,0000
0C33:0008 90            NOP
0C33:0009 90            NOP
0C33:000A BF0800        MOV     DI,0008
0C33:000D BE2000        MOV     SI,0020
0C33:0010 2E            CS:
0C33:0011 8B04          MOV     AX,[SI]
0C33:0013 2E            CS:
0C33:0014 8905          MOV     [DI],AX
0C33:0016 EBF0          JMP     0008
0C33:0018 B80000        MOV     AX,0000
0C33:001B CD21          INT     21
0C33:001D B80000        MOV     AX,0000
0C33:0020 EBF6          JMP     0018
0C33:0022 90            NOP
0C33:0023 06            PUSH    ES
0C33:0024 81F90002      CMP     CX,0200
-
;下面是执行完指令MOV CS:[DI],AX 后的反汇编代码
;s 的地址为 0008,内容已经变成了EB F6,说明将成功将[s2]的内容复制到了[s]
;下面分析一下 EB F6 为什么会被翻译成 JMP 0000
;与上面的分析相同,先找 EB F6 的下一条指令的地址为 000A
;EB F6 = JMP 000A + F6 = JMP  000A - 000A = JMP 0000
-u0005
0C33:0005 B80000        MOV     AX,0000
0C33:0008 EBF6          JMP     0000
0C33:000A BF0800        MOV     DI,0008
0C33:000D BE2000        MOV     SI,0020
0C33:0010 2E            CS:
0C33:0011 8B04          MOV     AX,[SI]
0C33:0013 2E            CS:
0C33:0014 8905          MOV     [DI],AX
0C33:0016 EBF0          JMP     0008
0C33:0018 B80000        MOV     AX,0000
0C33:001B CD21          INT     21
0C33:001D B80000        MOV     AX,0000
0C33:0020 EBF6          JMP     0018
0C33:0022 90            NOP
0C33:0023 06            PUSH    ES
0C33:0024 81F90002      CMP     CX,0200
-
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-1-26 21:32:21 | 显示全部楼层
本帖最后由 yixinwenxin 于 2021-1-26 21:52 编辑


mov cs:[di],ax        (ax的赋值给cs:di)  后执行 jmp short s,现在ip指向s:nop
我弄不明白cs:[di]   是怎么把  标号s2:jmp short s1  这句  移到  标号s:nop处的
不应该有一句  mov s  offset,cs:[di]吗?  (不知道这句合法不,只是想法)
就是di怎么赋值给nop的....?
只看到ax的值赋值给di后,di的值就没再变动过
还是说现在cs:[di]通过offset  就等于标号s  ?

问题二  jmp short s1   这句的问题机器码和标号的冲突     cup是只认识机器码,标号.......(好别扭)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-1-26 22:04:16 | 显示全部楼层

不好意思 没扭转过来思想
                        mov di,offset s
                        mov si,offset s2
                        mov ax,cs:[si]
                        mov cs:[di],ax
我不该以汇编的语言来理解电脑
该用电脑的规则理解代码的含义
是我着想了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-1-27 07:03:06 From FishC Mobile | 显示全部楼层

mov di,offset s   ; 这一句的意思是将s指向的内存地址赋给di
  mov si,offset s2     ;这一句是将s2指向的内存地址赋给si         
mov ax,cs:[si]      ;取si指向的内存地扯的值,即[s2]处的值赋给AX
mov cs:[di],ax    ;Ax的值赋给di指向的内存地址,即[s]处
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-1-27 11:37:48 | 显示全部楼层
yixinwenxin 发表于 2021-1-26 22:04
不好意思 没扭转过来思想
                        mov di,offset s
                        mov si,offset s2

语句标号那个问题我已经在注释里详细解释了。
机器是不认语句标号的,机器只认数(地址),你写代码的时候 JMP 后面接的是语句标号。
翻译成机器代码后 JMP 后面接的就变成了地址,不是语句标号。
怎么变的,注释里已经详细解释了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 08:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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