汇编王爽版 实验8的问题

作者&投稿:殷勤枯 (若有异议请与网页底部的电邮联系)
关于 王爽的汇编语言 试验8看不懂啊~

你应该从指令的含义上来理解。

jmp short s1 是短跳转,只包含了相对偏移。根据你的代码,它此处的含义是jmp -xxx ,注意-xxx 表示一个负的偏移。在s处也这样jmp -xxx后,它自然跳到了mov ax,4c00h 处。

你之所以不能理解是因为把这个s1和jmp指令硬联系在了一起,我再强调一次短跳转里没有包含s1的绝对地址。如果你用jmp far ptr s1,这样肯定会跳到s1,但这个地址是32位的,ax无法完全容纳,到时也会乱跳。

assume cs:codesg
codesg segment
mov ax,4c00H ;程序正常返回
int 21H
start:
mov ax,0 ;置ax为0
s:
nop ;空操作,占据一个字节
nop
mov di,offset s ;offset去偏移地址,所以di的值就是标号的偏移地址
mov si,offset s2 ;同上
mov ax,cs:[si] ;cs:[si]指向的是代码,所以这里是将cs:[si]即标号s2处的2个字节的 ;代码赋值给ax

mov cs:[di],ax ;cs:[di]指向的是标号s处,这里的意思是将ax的值赋值给标号s处, ;即nop nop 这两个字节将会被ax的值覆盖

s0:
jmp short s ;短转移到s处
s1:
mov ax,0
int 21H
mov ax,0
s2:
jmp short s1 ;短转移到s1
nop
codesg ends
end start

PS:若有不明白的地方,可以追问

assume cs:codesg
codesg segment
mov ax,4c00h ; cs:0 3个字节
int 21h ;2个字节
start: mov ax,0 ;三个字节
s: nop ; 执行下面的移动指令之后jmp ip-8被移动到S处,在执行完S0后行 ;执行 JMP IP-8到cs:0处返回程序
nop ;
mov di,offset s
mov si,offset s2
mov ax,cs:[si]
mov cs:[di],ax
s0: jmp short s ;编译后jmp ip-10(十进制)
s1: mov ax,0
int 21h
mov ax,0
s2: jmp short s1 ;编译器编译后为JMP ip-8
nop
codesg ends
end start

在s:标号处被拷贝的汇编指令是:jmp short s1,其机器码为EBF6,EB是修改指针,IP等于F6(这个补码的意思是当前IP减去10),
mov ax,4c00h 3byte
int 21h 2byte
start: mov ax,0 3byte
s: jmp short s1 2byte
10-10=0 也就是说debug中可以看到jmp short s1被编译成了jmp 0000
最后需要补充说明的是jmp short s1的指针值计算如下:
8位位移=标号处的地址-jmp指令后的第一个字节的地址
s1标号处地址=18h
而jmp指令地址是20h,在si中可以观察到,jmp指令本身是2byte,所以jmp指令后的第一个字节的地址是22h
那么使用替代法可得:
8位位移=18h-22h=-0ah
-0ah绝对值为0a
二进制代码为:00001010
按位求反的反码为:11110101
加1后得补码为:11110110
写成十六进制为F6,作用就是修改IP指针为IP=IP-10.机器指令为:EBF6.


君山区15684697716: 关于 王爽的汇编语言 试验8看不懂啊 -
豆鸦聚磺: 你应该从指令的含义上来理解.jmp short s1 是短跳转,只包含了相对偏移.根据你的代码,它此处的含义是jmp -xxx ,注意-xxx 表示一个负的偏移.在s处也这样jmp -xxx后,它自然跳到了mov ax,4c00h 处.你之所以不能理解是因为把这个s1和jmp指令硬联系在了一起,我再强调一次短跳转里没有包含s1的绝对地址.如果你用jmp far ptr s1,这样肯定会跳到s1,但这个地址是32位的,ax无法完全容纳,到时也会乱跳.

君山区15684697716: 王爽 汇编语言第二版 187页 实验8 -
豆鸦聚磺: 呵呵,你要好好理解“依据位移进行转移”这句话.我做个分析: 程序从start处开始执行. mov ax,0 nop nop ;nop是cpu空转指令 mov di,offset s ;将s的偏移地址放入di中 mov si,offset s2 ;将s2的偏移地址放入si中 mov ax,cs:[si] ;此处先打住...

君山区15684697716: 王爽老师的汇编语言 为什么8位数不能直接累加到16位dx寄存器,却可以直接赋值到作为中介的16位ax中? -
豆鸦聚磺: 1、立即数可以直接赋值到不同长度的寄存器中,这个赋值过程由编译器处理.2、8位数不能和16位数直接相加,需要在相加之前将8位转(cbw)为16位,再相加.特别是有负数参与运算时.----这些相加过程由程序员所编制的指令控制,编译器只负责翻译!

君山区15684697716: 王爽汇编语言检测点2.1 -
豆鸦聚磺: (1)写出每条汇编指令执行后相关寄存器中的值. 第一空:F4A3H ;<--把十进制数62627变成十六进制就是结果F4A3H 第二空:31A3H ;<--ah=31h,al不变,所以ax=31A3H 第三空:3123H ;<--al=23h,ah不变,所以ax=3123h 第四空:6246H ;<--ax...

君山区15684697716: 王爽汇编中关于div的介绍说:如果是做8位除法,商是存放在al中,余数是存放在ah中,但实际结果却不同 -
豆鸦聚磺: 把 mov bx,100 改成 mov bl,100 bx代表除数是16bit的word, 被除数默认就是32bit的dword,商在ax,余在dx bl代表除数是8bit的byte,被除数默认是16bit的word,ax,商在al,余在ah

君山区15684697716: 王爽汇编检测点2.2 的一些疑问: 给定段地址为0001H,仅通多偏移地址寻址,CPU的寻址为(00010H)到(1000FH -
豆鸦聚磺: 偏移地址:0x0000H~0xffffH 寻址 = 段地址*16+偏移地址(一个2进制数*2,该二进制数向前移一位,同样8,10,16进制相同) 由题:0001H*16+0000H ~ 0001H*16+ffffH 即为:00010H~1000fH

君山区15684697716: 王爽汇编语言第八章实验7 -
豆鸦聚磺: 就是因为是数据,所以才无法显示出来,1975之所以能显示,那是因为在内存中他是以ascii码形式存在的 ,所以那些数据要显示出来必须要转成ascii码.

君山区15684697716: 王爽汇编向硬盘读写数据 -
豆鸦聚磺: 这个问题涉及到三个方面: 1. 关于读入内存的问题:根据冯诺依曼微型计算机结构体系,一切外设,包括端口在内,使用CPU存取时,必须经过内存.当然这里所说的内存是个广义概念,它包括一切RAM和ROM.读取硬盘数据也是一样,必须...

君山区15684697716: 王爽 汇编语言 -
豆鸦聚磺: 1.table有4个表目,每个指向一个子程序的偏移地址 2.ah是8位寄存器(字节),用来传送子程序编号,对头 3.add bx,bx是为了由子程序编号得到存放对应子程序的偏移地址的表目的偏移地址(有点拗口),可替换为shl bx,1 4.add bx,bx怎么会得双字,顶多就17位,就是说可能溢出 5.table[bx]是内存单元,对,寄存器相对寻址.他的宽度,要看环境.如另外一个操作数或者word ptr table[bx]多加分,少匿名,会有很多人答!

君山区15684697716: 王爽汇编语言 实验10的问题 -
豆鸦聚磺: 大概看了下, 子程序设计中一般都会 在入口处保护寄存器,将用到的非参数寄存器存在栈中, 在子程序结束时再弹出来,以恢复原先的值. 这是为了让子程序的运行不影响到子程序外的其它代码...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网