Zingy 发表于 2021-2-13 23:09:49

对于这一段代码,为什么ah是高四位,al是第四位?

mov ah,al
shr ah,1
shr ah,1
shr ah,1
shr ah,1
and al,00001111h
图为原完整程序
问题(1)对于这一段代码,为什么ah是高四位,al是第四位?
问题(2)不用这一小段程序本来ah不就是高四位,al是第四位吗

635924705 发表于 2021-2-14 00:50:16

SHR(右移)指令使目的操作数逻辑右移一位,最高位用 0 填充。最低位复制到进位标志位,而进位标志位中原来的数值被丢弃。
SHR 与《SHL指令》一节中介绍的 SHL 的指令格式相同。在下面的例子中,AL 中的最低位 0 被复制到进位标志位,而 AL 中的最高位用 0 填充:
mov al, 0D0h   ; AL = 11010000b
shr al, 1            ; AL = 01101000b, CF = 0

在多位移操作中,最后一个移出位 0(LSB)的数值进入进位标志位:
mov al, 00000010b
shr al, 2                  ; AL = 00000000b, CF = 1
出自这个帖子http://c.biancheng.net/view/3591.html
所以,16位寄存器,原来ah是高8位,al是低8位,现在右移4位,ah左边补位4个零,右边是高四位,al本来是8个0进去了低四位在左边。应该这么理解就行了。

wtchou 发表于 2021-2-14 00:52:09

ax为16位寄存器
ah为高8位, al为低8位

一个字节的数据(8位)需要用2个16进制表示
也就是每4位用1个16进制表示
例如: 175以16进制表示为AF, A就是高四位, F就是低4位


Zingy 发表于 2021-2-14 01:25:52

wtchou 发表于 2021-2-14 00:52
ax为16位寄存器
ah为高8位, al为低8位



emmm你好像没有理解我的问题是什么

wtchou 发表于 2021-2-14 04:08:00

本帖最后由 wtchou 于 2021-2-14 04:18 编辑

假设要显示16进制的BD, 那么al的值为0BDh
BD可看成二进制的 1011 1101
1. 将al的值复制到ah中, ah = 1011 1101
2. 将ah右移4位, ah = 0000 1011 = B, 也就是BD的高四位
3. al = 1011 1101, 将al和00001111做and运算, 得到al = 00001101 = D, 也就是BD的低四位





the-tk 发表于 2021-2-14 11:58:58

1
页: [1]
查看完整版本: 对于这一段代码,为什么ah是高四位,al是第四位?