装配移动al寄存器值到ax

时间:2018-03-20 04:43:50

标签: assembly x86-16 emu8086

我对程序集完全不熟悉,在搜索之后我还有一些关于寄存器的问题。 目前我正试图通过这样做来反复划分一个值:

1.在bl上划分斧头(似乎剩余部分转向啊,商数转向al)

2.将al(商)移到ax

3.如果ax小于或等于0,则跳至5

4.jump to 1

5.end

问题发生在指令2上,因为我试图将8位值移动到16位值。 有人知道如何解决这个问题吗?

我使用的是emu8086,因此寄存器只有x,h和l。

3 个答案:

答案 0 :(得分:4)

您的问题基本归结为:

  

如何将al移至ax

答案就是你移动它,它已经存在了。 16位ax寄存器由两个8位寄存器ahal组成:

  ______________ ax ______________
 /                                \
+-+-+-+-+-+-+-+-+  +-+-+-+-+-+-+-+-+
|f|e|d|c|b|a|9|8|  |7|6|5|4|3|2|1|0| <- individual bits
+-+-+-+-+-+-+-+-+  +-+-+-+-+-+-+-+-+
 \____    _____/    \_____    ____/
       ah                  al

如果您想确保ax完整设置为al中的任何内容,您只需要清除ah部分,类似的东西:

and ax, 0ffh

这将清除除最低(最右边)8位之外的所有位,有效地将f..8区域设置为全零,从而确保ax变为al

答案 1 :(得分:2)

您必须区分两种情况:

案例1:

<div class="plan recommended"> <div class="recommended-badge"><span>DOUBLE DATA</span></div> <div data-equalizer-listener="plan-heading" class="plan-header"> <div class="prices"> <div class="col total"> <div class="price"><sup>$</sup> <span class="amount">85</span> <span class="caption">per month</span></div> </div> <p class="min-payment">Min. Total Cost is $2,040 over 24 months.</p> </div> </div> <div class="features"> <div class="feature included_data PO_Included_Data standard first" data-equalizer-selector="PO_Included_Data" style="height: 247px;"> <div class="description"><span class="highlight-text">28GB TOTAL DATA</span><br> <span class="legal">Includes 14GB + 14GB bonus data for 24 mths<br>New and recontracting services only<br>Offer ends 15/04/18<br>$10 per extra 1GB</span> </div> <div class="more-data-info hide" data-information="included-data"> <strong>Data Pool -</strong> Combine any of our latest My Plan Plus (including SIM Only) and My Mobile Broadband Plus plans on the one bill to pool and share the data. </div> <div> <a href="#" class="more-data-link" data-information="included-data" tabindex="0">more</a> </div> </div> </div> </div>包含无符号数(0 ... 255)。在这种情况下,您必须清除16位寄存器al的高8位。

As&#34; paxdiablo&#34;在他的回答中写道,你可以使用ax(3个字节)来完成这项工作,但是指令and ax, 0FFh(2个字节)应该更有效率。两条指令都会这样做。

案例2:

mov ah, 0包含有符号的数字(-128 ... 127)。在这种情况下,如果al的最高位清零,则必须清除ax的高8位;否则你必须设置它们。

al指令(该指令没有参数,因为它只适用于cbw寄存器)将完成这项工作。

答案 2 :(得分:1)

一般来说,您可以使用movsxmovzx将较小的值移动到较大的位置。 LCI maintains the sign of the value(如果移动0xfe,则变为0xfffe),而mysql> select * from lci; +-------+------------+---------------------+-----------------------+--------+------+---------+---------+----------+---------------------+----------+ | L_ID | L_DATE | HEADING | SEC_ID | SUB_ID | I_ID | NEW_INS | SEND_ID | NEW_SEND | R_DATE | L_DATE_ | +-------+------------+---------------------+-----------------------+--------+------+---------+---------+----------+---------------------+----------+ | 1 | 2017-12-28 | qwerty test | Development Section | E/14 | SPDA | | Item 1 | | 2017-12-19 00:00:00 | NULL | | 10630 | 2018-01-02 | test | Development Section | DEV1 | CCO | | Item 4 | | 2018-01-04 00:00:00 | NULL | | 12 | 2018-01-02 | test | Development Section | E5 | CSO | | Item 4 | | 2018-01-04 10:59:12 | NULL | | 14 | 2018-01-04 | Testing | Establishment Section | E/14 | SPDA | | Item 2 | | 2018-01-17 10:54:57 | 10:54:32 | | 15 | 2018-01-04 | Testing | Establishment Section | E/14 | CSO | | Item 3 | | 2018-01-08 10:54:57 | 10:54:32 | | 2 | 2018-01-03 | test | Development Section | E14 | PSC | | Item 2 | | 2018-01-05 10:59:12 | NULL | | 3 | 2018-01-01 | test | Establishment Section | E5 | CSO | | Item 2 | | 2018-01-04 11:35:02 | NULL | | 34 | 2018-01-15 | 2018 action plan | Development Section | E3 | PSC | | Item 1 | | 2018-01-15 15:49:38 | NULL | | 4 | 2018-01-02 | test | Development Section | DEV1 | CCO | | Item 4 | | 2018-01-04 00:00:00 | NULL | | 5 | 2018-01-02 | test | Development Section | DEV1 | CCO | | Item 4 | | 2018-01-04 00:00:00 | NULL | | 6 | 2018-01-03 | you can do this | Establishment Section | E14 | CSO | | Item 1 | | 2018-01-10 12:57:04 | NULL | | 678 | 2018-03-07 | qwerty | Establishment Section | E/1 | CSO | | Item 1 | | 2018-03-06 12:28:37 | 12:28:24 | | 679 | 2018-03-07 | qwerty | Establishment Section | E/14 | CSO | | Item 1 | | 2018-03-06 12:28:37 | 12:28:24 | | 7 | 2018-01-04 | yes you can do this | Establishment Section | E/14 | CSO | | Item 1 | | 2018-01-09 14:10:56 | 14:10:36 | +-------+------------+---------------------+-----------------------+--------+------+---------+---------+----------+---------------------+----------+ 14 rows in set (0.00 sec) 对值进行零扩展(使得0xfe变为0x00fe)。

但是,在您的具体情况下,您根本不需要做任何动作。 Movsx已指定movzx的低8位。您需要做的就是清除AX的高位,您可以通过多种方式进行操作,但AL可能是最简单的。