gpt4 book ai didi

assembly - 从最高有效位或高位开始提取寄存器的位

转载 作者:行者123 更新时间:2023-12-01 10:19:27 26 4
gpt4 key购买 nike

编辑:

没想到这个问题这么快就火了。根据我已经收到的答案,我似乎遗漏了一条重要的信息。模式是 不是固定数量的位 。有些字母可能有更多或更少的位。即,B 有 5 位,但 C 可能最多使用 6 位,但没有一个使用超过一个字节。我在我的问题中包含了一个“A”位模式的例子,它每行使用 7 位。另请参阅问题底部的编辑。

我是组装新手。我有对应于字母文本表示的位模式。每个 1 代表一个 $(或任何符号),每个 0 代表一个空格。 IE:

    $$$$            11110
$ $ 10001
$ $ 10001
$$$$ 11110
$ $ 10001
$ $ 10001
$$$$ 11110

$ 0001000
$ $ 0010100
$$$$$ 0111110
$ $ 1000001

我编写了一个汇编语言程序,它读取每个模式并根据它读取的是 1 还是 0 来打印正确的符号。要确定它是 1 还是 0,我将寄存器与 1 相加,然后右移bits 的数量等于每行中的位数,然后比较结果:

请注意,每一行的位存储在单独的 2 字节字的底部,我将其加载到 8 位寄存器中。
patternb:   dw 011110b,010001b,010001b,011110b,010001b,010001b,011110b

rowloop:
mov bl,[patternb+si] ;iterate through each element in binary array

patternloop:
mov bh,bl ;move bit pattern into register so that we can change it
and bh,1 ;AND register to find set bits and store back in register
shr bl,1 ;SHIFT original bit pettern right
cmp bh,1 ;check if bit is set or not (1=set, else 0)
je writesym ;if set, write symbol
jne writeblank ;if not set, write space

问题在于 AND 的工作方式。显然它从最低有效位开始并在位右移时打印,但这会导致它以“反向”顺序打印字母的问题。 IE:
 ####
# #
# #
####
# #
# #
####

我尝试了一些操作,但似乎都不起作用。我还尝试移动和旋转位模式以对应正确的打印,但这不适用于每一行,因为不是每一行都需要以这种方式进行操作。 (例如,第 2 行将正确打印而无需先进行操作)。我对 A-E 中的每个字母都有相同的位模式技术。

理想情况下,我希望它以某种方式从最重要的位开始比较,然后以正确的顺序打印它 ,但我不确定如何操作这些位以实现这一目标。

编辑:
按照 Peter Duniho 的回答,我想发布一些我尝试过的东西:
我试过用 10000b 对模式进行 AND 运算,然后 ROL 结果得到 00001b 的答案,然后将位左移。然后比较结果以查看应该打印哪个符号。这也不起作用,但因为位模式并不总是固定的,所以无论如何都不是解决方案。
    mov bh,bl   ;move bit pattern into register so that we can change it
and bh,10000b ;AND register to find set bits and store back in register
rol bh,1 ;rol result to obtain 00001b
shl bl,1 ;SHIFT original bit pettern right
cmp bh,1 ;check if bit is set or not (1=set, else 0)
je writesym ;if set, write symbol
jne writeblank ;if not set, write space

我现在最接近解决这个问题的方法(在 Peter Duniho 的回答的帮助下作为指导)是将我的位数组存储为完整的 8 位形式(即 011110000b 等而不是 011110b 否则汇编程序将其隐式存储为 00011101正如 Martin Rosenau 的回答中提到的,我们不想要)和完整的 10000000b(因为我们最多使用 8 位,这让我们检查 MSB)而不是 1( 000000001b ),因为我试图之前做,然后使用上面的 ROL 和比较方法(或者只是将它与 10000000b 进行比较)。循环总共运行 7 次(由于每个字母有 7 行/位模式,除了 A 有 4 行,所以 A 打印不正确,但这是一个我可以在某些条件下解决的问题。程序可以运行并打印现在正确。这是我使用的代码:
        mov bh,bl   ;move bit pattern into register so that we can change it
and bh,10000000b ;AND register to find set bits and store back in register
rol bh,1 ;shift MSB to LSB to compare (or could just compare with 10000000b instead)
shl bl,1 ;SHIFT original bit pettern left
cmp bh,1 ;check if bit is set or not (or use cmp bh,10000000b and omit rol above)
je writesym ;if set, write symbol
jne writeblank ;if not set, write space

我已将 Peter 的解决方案标记为答案,因为它为我指明了解决此问题的正确方向。但正如他所提到的,有很多方法可以解决这个问题(如发布的不同解决方案所示),但他恰好是我为我自己的代码实现的最简单的方法,这正是他想要的。

Martin Rosenau 的回答也很有见地,尤其是优化方面。当我有更多时间时,我会尝试实现这些,然后更新上面的解决方案。

最佳答案

Ideally I'd want it to start comparing from the most significant bit somehow which should then print it in the correct order



对我来说似乎是个好主意。你有没有尝试过这些方面的事情?如果是这样,您具体尝试了什么?你遇到了什么具体的困难?

同时…

什么决定了要检查的位位置数(即循环计数)?是固定的吗?如果是这样,为什么不只是与高端而不是低端的位(例如 10000b ,又名 16 )和左移而不是右移?

例如。
mov bh,bl     ;move bit pattern into register so that we can change it
and bh,10000b ;AND register to find set bits and store back in register
shl bl,1 ;SHIFT original bit pattern left
cmp bh,10000b ;check if bit is set or not (1=set, else 0)
je writesym ;if set, write symbol
jne writeblank ;if not set, write space

如果您直到运行时才知道循环计数,您可以为每次迭代移动:
mov bh,bl     ;move bit pattern into register so that we can change it
shr bh,cl ;the assumption being that cl has the width of your bit pattern
dec cl ;next bit
and bh,1 ;AND register to find set bits and store back in register
cmp bh,1 ;check if bit is set or not (1=set, else 0)
je writesym ;if set, write symbol
jne writeblank ;if not set, write space

如果您已经在循环中使用 CX,显然上述内容需要稍作修改。但希望你能明白基本的想法。

上面的一个变体是例如通过存储 al 将 AND 位模式存储在另一个寄存器中(例如 1 )并左移适当的计数(例如 shl al,cl ),然后使用 al作为操作数而不是 10000b如上面的第一个例子。

这些远不是您唯一的选择。您需要大大缩小问题的范围以获得更具体的答案。但是,假设这是学习 ASM 的练习,那么这是一个很好的机会,可以让您阅读和了解可用的位操作操作的更多信息。 :)

关于assembly - 从最高有效位或高位开始提取寄存器的位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55467193/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com