在汇编输入和输出中使用shl和rol

时间:2016-03-30 05:17:00

标签: assembly x86-64

我正在编写汇编代码以接受来自用户的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

1 个答案:

答案 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