以下是将数据部分中初始化的两个数字相乘为“buff1”和“buff2”的代码。这些乘以连续的加法,其中buff1在rax寄存器中加上buff2次以得到结果,稍后通过hex_ascii程序使用tempbuff变量显示。
%macro print 2
mov rax,1
mov rdi,1
mov rsi,%1
mov rdx,%2
syscall
%endmacro
%macro accept 2
mov rax,0
mov rdi,0
mov rsi,%1
mov rdx,%2
syscall
%endmacro
%macro exit 0
mov rax,60
mov rdi,0
syscall
%endmacro
section .bss
choice resb 2
tempbuff resb 16
section .data
menu db 10,"1. Successive addition"
db 10,"2. Add and Shift"
db 10,"Enter the choice : "
lenmenu equ $-menu
after db 10,"Product is : "
lenafter equ $-after
buff1 dw 0AH
buff2 dw 03H
newline db 0AH
section .code
global _start
_start:
print menu,lenmenu
accept choice,2
mov al,byte[choice]
case1:
cmp al,31H
jne case2
print after,lenafter
call succ_add
jmp _start
case2:
cmp al,32H
jne case3
call shift_add
jmp _start
case3:
exit
succ_add:
mov rax,0H
;mov rcx,0H ;Here is the problem
;mov cx,0H
mov bx,[buff1]
mov cx,[buff2]
back0:
add rax,rbx
loop back0
mov rbx,rax
call hex_ascii
ret
hex_ascii:
mov rcx,16
mov rax,0H
mov rsi,tempbuff
back1:
rol rbx,4
mov al,bl
and al,0FH
cmp al,09H
jbe add30
add al,07H
add30:
add al,30H
mov [rsi],al
inc rsi
loop back1
print tempbuff,16
ret
shift_add:
exit;code for this section not written yet
ret
在succ_add过程里面的上面代码中,如果我将rcx初始化为0,那么我的代码工作正常(给出正确的结果);但如果我将cx寄存器初始化为0,然后将其指定为[buff2],那么它不会给我正确的结果。 由于循环运行buff2次(cx次),那么即使我将cx初始化为0而不是分配它[buff2],问题又是什么? 在我的代码中将cx初始化为0并将rcx初始化为0 时有什么区别吗? 另外,另一个问题是,有没有办法可以将2字节大小的变量分配给8字节大小的寄存器? enter image description here
答案 0 :(得分:1)
在64位模式下,循环使用rcx,而不是cx。 Mov cx,[buff2]只写cx - rcx的低16位。
使用movzx ecx,word [buff2]。这会初始化整个寄存器。 (低16位加载buff2的内容,寄存器的其余部分为0.)所以你之前不需要mov rcx,0。