零基础汇编实验八疑问
问题标红{
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,执行的是机器编码?
} ;源代码
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: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是只认识机器码,标号.......(好别扭) xieglt 发表于 2021-1-26 09:40
;源代码
不好意思 没扭转过来思想
mov di,offset s
mov si,offset s2
mov ax,cs:
mov cs:,ax
我不该以汇编的语言来理解电脑
该用电脑的规则理解代码的含义
是我着想了
mov di,offset s ; 这一句的意思是将s指向的内存地址赋给di
mov si,offset s2 ;这一句是将s2指向的内存地址赋给si
mov ax,cs: ;取si指向的内存地扯的值,即处的值赋给AX
mov cs:,ax ;Ax的值赋给di指向的内存地址,即处 yixinwenxin 发表于 2021-1-26 22:04
不好意思 没扭转过来思想
mov di,offset s
mov si,offset s2
语句标号那个问题我已经在注释里详细解释了。
机器是不认语句标号的,机器只认数(地址),你写代码的时候 JMP 后面接的是语句标号。
翻译成机器代码后 JMP 后面接的就变成了地址,不是语句标号。
怎么变的,注释里已经详细解释了。
页:
[1]