Assembly NASM编程中数据从变量到寄存器的移动
下面是将数据段中初始化为buff1和buff2的两个数字相乘的代码。这些值乘以连续加法,其中buff1在rax寄存器中加buff2次以给出结果,然后使用TEMPBUF变量通过十六进制ascii程序显示Assembly NASM编程中数据从变量到寄存器的移动,assembly,nasm,x86-64,Assembly,Nasm,X86 64,下面是将数据段中初始化为buff1和buff2的两个数字相乘的代码。这些值乘以连续加法,其中buff1在rax寄存器中加buff2次以给出结果,然后使用TEMPBUF变量通过十六进制ascii程序显示 %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 m
%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字节大小的寄存器中?
在64位模式下,循环使用rcx,而不是cx。Mov cx,[buff2]只写入cx——rcx的低16位
使用movzx-ecx,单词[buff2]。这将初始化整个寄存器。低位16位加载buff2的内容,寄存器的其余部分为0。因此,在它之前不需要mov rcx,0。注意,您还应该使用movzx ebx,word[buff1]。因此,在movzx ecx,word[buff2]之后,除buff2内容占用的空间之外的高阶位将初始化为0。对吗?假设当前ecx是00 05 00。现在,如果我写mov ecx,单词[k]和[k]是00 03,那么ecx的最终值是多少?上述说明是否会因为尺寸不同而出错?另外,如果我现在写mov-cx,word[]k]而不是上面的指令,那么ecx的最终值是多少?必须是00 05 00 03。对吧?你不能写mov-ecx,word[k]。源和目标的大小必须相同。是的,mov cx,[k]加载ecx的低16位,保持高16位不变。感谢您的澄清!!