我对程序集完全不熟悉,在搜索之后我还有一些关于寄存器的问题。 目前我正试图通过这样做来反复划分一个值:
1.在bl上划分斧头(似乎剩余部分转向啊,商数转向al)
2.将al(商)移到ax
3.如果ax小于或等于0,则跳至5
4.jump to 1
5.end
问题发生在指令2上,因为我试图将8位值移动到16位值。 有人知道如何解决这个问题吗?
我使用的是emu8086,因此寄存器只有x,h和l。
答案 0 :(得分:4)
您的问题基本归结为:
如何将
al
移至ax
。
答案就是你不移动它,它已经存在了。 16位ax
寄存器由两个8位寄存器ah
和al
组成:
______________ 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)
一般来说,您可以使用movsx或movzx将较小的值移动到较大的位置。 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
可能是最简单的。