yixinwenxin 发表于 2021-1-25 22:28:23

零基础汇编实验八疑问

问题标红
{
        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:
                        mov cs:,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:        (cs:si指向的值赋值给ax)
;                mov cs:,ax        (ax的赋值给cs:di)
;总感觉这里缺少一句,mov di,offset s 这样写的话是不是短暂的关联在一起。cs:di 表示的就是s标号
;                jmp short s                 (回跳标号s处)
;                s执行的是s2的指令        (s2的),而s2的机器编码是EBF6
;cpu不管s2处的标号s1,执行的是机器编码?
}

xieglt 发表于 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:
        mov cs:,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,地址为 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,
0C33:0013 2E            CS:
0C33:0014 8905          MOV   ,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:,AX 后的反汇编代码
;s 的地址为 0008,内容已经变成了EB F6,说明将成功将的内容复制到了
;下面分析一下 EB F6 为什么会被翻译成 JMP 0000
;与上面的分析相同,先找 EB F6 的下一条指令的地址为 000A
;EB F6 = JMP 000A + F6 = JMP000A - 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,
0C33:0013 2E            CS:
0C33:0014 8905          MOV   ,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
-

yixinwenxin 发表于 2021-1-26 21:32:21

本帖最后由 yixinwenxin 于 2021-1-26 21:52 编辑

xieglt 发表于 2021-1-26 09:40
;源代码

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

问题二jmp short s1   这句的问题机器码和标号的冲突   cup是只认识机器码,标号.......(好别扭)

yixinwenxin 发表于 2021-1-26 22:04:16

xieglt 发表于 2021-1-26 09:40
;源代码

不好意思 没扭转过来思想
                        mov di,offset s
                        mov si,offset s2
                        mov ax,cs:
                        mov cs:,ax
我不该以汇编的语言来理解电脑
该用电脑的规则理解代码的含义
是我着想了

xieglt 发表于 2021-1-27 07:03:06


mov di,offset s   ; 这一句的意思是将s指向的内存地址赋给di
mov si,offset s2   ;这一句是将s2指向的内存地址赋给si         
mov ax,cs:      ;取si指向的内存地扯的值,即处的值赋给AX
mov cs:,ax    ;Ax的值赋给di指向的内存地址,即处

xieglt 发表于 2021-1-27 11:37:48

yixinwenxin 发表于 2021-1-26 22:04
不好意思 没扭转过来思想
                        mov di,offset s
                        mov si,offset s2


语句标号那个问题我已经在注释里详细解释了。
机器是不认语句标号的,机器只认数(地址),你写代码的时候 JMP 后面接的是语句标号。
翻译成机器代码后 JMP 后面接的就变成了地址,不是语句标号。
怎么变的,注释里已经详细解释了。
页: [1]
查看完整版本: 零基础汇编实验八疑问