assembly 如何在汇编中编写if-else?

pvabu6sv  于 2023-04-12  发布在  其他
关注(0)|答案(3)|浏览(122)

如何用汇编语言编写下面的if else语句?
C代码:

If ( input < WaterLevel)
{
     MC = 1;
}
else if ( input == WaterLevel)
{
     MC = 0;
}

伪码

If input < Water Level
Send  1 to microcontroller
Turn Motor On

Else if input == Water Level
Send 0 to microcontroller
Turn Motor Off

组装不完整:(MC-微控制器)

CMP Input, WaterLevel
MOV word[MC], 1

MOV word[MC], 2
fv2wmkja

fv2wmkja1#

如果我们想在C中做一些事情,比如:

if (ax < bx)
{
    X = -1;
}
else
{
    X = 1;
}

它在Assembly中看起来像这样:

cmp    ax, bx      
 jl     Less  
 mov    word [X], 1    
 jmp    Both            
Less: 
 mov    word [X], -1  
Both:
nnt7mjpx

nnt7mjpx2#

由于不知道您使用的特定汇编语言,我将用伪代码写出以下内容:

compare input to waterlevel
if less, jump to A
if equal, jump to B
jump to C
A:
send 1 to microcontroller
turn motor on
jump to C
B:
send 0 to microcontroller
turn motor off
C:
...

对于前三个命令:大多数汇编语言具有条件分支命令来测试零或符号位的值,并根据该位是否被设置来跳转。

nom7f22z

nom7f22z3#

缓存结构:该高速缓存是双向关联的,也就是说有2个集合,每个集合可以存储2个块。每个块的大小为4字节,因此每个集合总共可以存储8字节。因此,缓存大小为16字节(2个集合x 2个块/集合x 4个字节/块)。
用于选择集合和标记的位:由于有2个集合,我们需要1位在它们之间进行选择。该高速缓存块大小为4字节,这意味着地址的低2位用于在块内的4个字节之间进行选择。因此,剩余的位(6位)用于存储标签,该标签用于与所请求地址的标签进行比较,以确定数据是否存在于缓存中。
导致缓存未命中的地址:如果代码通过32个元素的一维char数组读取字节在跨一模式中,如果高速缓存的读取时间为32字节(即,32字节),该高速缓存最初将为空。(即,0x 000 - 0x 007)将导致高速缓存未命中,因为在该高速缓存中不存在块。因此,高速缓存未命中的总数为8,高速该高速缓存未命中率为8/32 = 25%。
奇偶读的缓存未命中率:如果先读取偶数地址,则前4个读取(0x 000、0x 002、0x 004和0x 006)将导致高速缓存未命中,因为该高速缓存中不存在任何块。之后,每个偶数读取将导致高速缓存命中,因为两个集合都可以保存偶数地址。当然后读取奇数地址时,前4个读取将导致高速缓存命中。(0x 001、0x 003、0x 005和0x 007)也会导致缓存未命中,因为奇数地址Map到与偶数地址不同的集合。之后,每个奇数读取都会导致缓存命中,因为两个集合都可以保存奇数地址。因此,缓存未命中的总数为8,该高速缓存未命中率仍为25%。

相关问题