-
有四种方法,其中第二种是错误的,我就不多说了,比较一下1、3、4三种方法:
其中第一个是最快的,记住无论什么时候,寄存器操作都是最快的,要实现某个功能,首先应该考虑使用系统提供的现有指令来实现该功能,而不是使用其他几个指令自己实现,因为系统提供的指令在硬件实现方面是最优的。 例如,有两种方法可以做到这一点:
1). mov eax,a
xchg eax, b < - 利用系统 xchgmov a, eax 提供的指令
2). mov eax,a
mov ebx,b
mov a,ebx
mov b,eax
显然,第一种类型速度快,指令少,使用系统提供的指令来实现功能(当然,有时指令的数量并不能衡量程序的质量)。
这要求我们使用多个寄存器和系统提供的实现说明。
第三种和第四种方法其实是一样的,从头到尾都是内存操作,当然速度要慢很多。 必须添加这两种方法。 386,如果不加,默认为3为16位操作,无法达到交换的目的; 对于 4,8086 和 8088 无法运行,因为它们不提供 32 个操作指令。
-
就个人而言,我认为第二种方法更快。
-
首先,第二段是错误的。 MOV指令不直接传输内存到内存数据,第二句话是错误的。
此外,测试速度取决于 CPU 的类型。 这是因为在不同类型的 CPU 上执行相同指令所需的时钟数是不同的。
在第一段中,每个 MOV 都是一个循环。
XCHG 是三个周期(P4 环境)。
而第二段**,就算他没有错,也差不多是三个周期。 因为我不知道第二句话的循环,因为根本没有用。
-
从标题中可以看出,您应该在 8086 下提出一个编译问题。
首先,介绍一下背景。 早期,只有 20 个 PC 地址总线,也就是说,系统可以寻址 2 到 20 次方,即 1M 字节但是,我们的 8086 寄存器没有 20 位,只有 16 位,如 CS、DS、ES、SS 段基址寄存器、AX、BX 等通用寄存器,都是 16 位。
因此,请寻址 1m 字节的空间。 这种“线段 + 偏移”二维表示只能使用。
例如,地址0000:0401(以下代表地址的数字均为十六进制),根据上述计算方法,实际对应的物理单元地址为段地址0*16+偏移地址0401,即物理单元在00401; 同一物理单位也可以用 0040:0001 对段偏移量(以相同的方式计算)或 003f 表示:
0011 表示 (003f0+0011) = 0401。
好吧,说到这里,你应该已经看到了背景。 让我们谈谈你问的问题。 20000H地址单位,SA(段基址)最大值很容易确定,只要偏移量最小,SA自然最大。
所以 maxsa = 20000h 10h = 2000h
那么minsa呢?
当然,当偏移量最大时,SA自然是最小的。 但最大的转变是什么时候?
ffffh?当然不是。 由于目标地址单元的最后四位是 0h,因此偏移量的最低四位也必须为 0
也就是说,最大偏移量为 FFF0h。 然后剩下的,应该很容易忘记。 应用公式,minsa*10h+fff0h=20000h <==> minsa = 1001h
经过长时间的搜索,最终的极限值为:
1001:fff0 = 20000h
2000:0000 = 20000h
-
一楼的分析非常详细,达到了大学老师的水平。
-
我也在为这个话题而苦苦挣扎,学到了。。
-
楼上,别混淆了,房东写的是51单片机的汇编语言,你说的是8086的汇编语言,两者是不一样的。
房东的程序,我在uvison中编译了,没有错,而且没有说b是未定义的,请仔细检查一下房东,是不是别处输入的问题。
下面的程序要做的应该是找到芯片中位于RAM30H开头的5个数字的平均值,注解如下:
up:add a,@r0 ;添加 A 和 R0 指向的片上 RAM 单元的内容。
inc r0 ;R0 指向下一个存储单元。
djnz r5, up ;控制UP循环执行5次,即将R0指向的从30h开始的5个单位加到累加器A中,总循环为5次,因为A的初始值为0,所以实际上,这5个单位的内容是相加的。
div ab ;A除以b,b的初始值为数字5,即得到平均值,但平均值的商在a中,余数在b中。
SJMP$ 程序停止。
-
您可以将其添加到数据细分受众群中。
b dw ?
第二个意识是圆形的,然后除以 ab
-
在 8086 中,如果未指定段的定位类型,则编译器默认为 para。 也就是说,段的起始地址位于可用第一部分的边界(每个部分为 16 个字节)。
例如,假设有一个 **:
name1 segment
db 0name1 ends
name2 segment
db 0, 1
name2 ends
一般来说,name1 段只有一个字节,name2 段只有两个字节,所以可以不间隔地将 name1 和 name2 顺序存储在内存中,以节省空间,但这对编译器来说要求太高了。
编译器通过将 name1 放在一个部分的起始地址和 name2 放在另一个部分的起始地址来处理此问题,这两个部分以 16 字节的边界对齐。 即使 name1 只包含一个字节,它也会占用 16 个字节的存储空间。 毫无疑问,上面定义的两个数据段总共占用了 32 字节的存储空间。
这里我们可以做一个总结:如果一个段定义的字节数不超过16个字节,则占用16个字节的空间; 如果大于 16 且小于 32 字节,则占用 32 个字节的空间,因此为 (n 16 + 1) * 16,四舍五入 n 16 后计算。
mov dx,3 是初始化 dx,注意 dx 中的二进制是 0000 0000 0000 0011,稍后会用到。 >>>More
findfile proc _lpszpath
local @stfindfile:win32_find_data >>>More
学习C,操作系统的核心和网络部分都是用C语言编写的,当黑客肯定学习C语言时用于服务器的 UNIX 和 Linux 系统也是 C 的基础。 不学习 C 语言,你什么都做不了。 >>>More