我正在编写汇编代码以接受来自用户的n个号码以执行添加。 为什么在输入和显示输出时使用shl和rol指令?
代码:
takeno:
print msg2,len2 ;calls a macro to display "Enter number"
accept var2,17 ;accepts number in var2
xor rbx,rbx
mov rsi,var2 ;how rsi works as array or array pointer?
mov ch,16
mov cl,4
up:
shl rbx,cl ;Why this step ?
mov al,[rsi]
call asciitohex ;convers ascii input to hex
add bl,al
inc rsi
dec ch
jnz up
add [var3],rbx
dec byte[var1]
jnz takeno
xor rbx,rbx
mov rbx,[var3]
mov rsi,var2
mov ch,16
mov cl,4
display:
rol rbx,cl ;why rol?
mov al,bl
and al,0f ;what this line does?
call asciitohex
mov [rsi],al
inc rsi
dec ch
jnz display
答案 0 :(得分:2)
display:
rol rbx,cl ;why rol?
mov al,bl
and al,0f ;what this line does?
call asciitohex
mov [rsi],al
inc rsi
dec ch
jnz display
这是一个将RBX的内容显示为16位十六进制的函数 第一个向左滚动高4位,使它们显示为最低半字节,然后用0x0f“屏蔽掉”,只保留一个半字节。我假设“asciitohex”将0-15改为'0' - '9','a' - 'f',然后将其存储在[SI]中 这重复了16次,(ROL将所有数据保存在rBX中,只重新排列它们。 - >所有16位数据都存储在[SI] - [SI + 15]
ROL sample: ROL rBX
RBX before ROL AEFD12349876CCDE
after ROL,4 EFD12349876CCDEA (a gets last nibble)
and 0x0f 000000000000000A --> first Digit
after ROL,4 FD12349876CCDEAE (a gets last nibble)
and 0x0f 000000000000000E --> second Digit
after ROL,4 D12349876CCDEAEF (a gets last nibble)
and 0x0f 000000000000000F --> 3rd Digit
等等
上层函数反过来,它将[SI]处的hexString转换为寄存器BX中的64位int BX归零,对于每个数字,当前值由一个半字节SHL,然后将[SI]中当前数字的bin值添加到其中
xor rbx,rbx
mov rsi,var2 ;how rsi works as array or array pointer?
mov ch,16
mov cl,4
up:
shl rbx,cl ;Why this step ?
mov al,[rsi]
call asciitohex ;convers ascii input to hex
add bl,al
inc rsi
dec ch
jnz up
在这里,一个例子讲述了不止一个解释:
SI content "ac12...."
rBX=0000000000000000
SHL rBX,4 0000000000000000
"a" is added (after convert) 000000000000000a
SHL rBX,4 00000000000000a0
"c" is added (after convert) 00000000000000ac
SHL rBX,4 0000000000000ac0
"1" is added (after convert) 0000000000000ac1
SHL rBX,4 000000000000ac10
"2" is added (after convert) 000000000000ac12
...
16 times for completely fill rBX