Assembly NASM编程中数据从变量到寄存器的移动

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

下面是将数据段中初始化为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
    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位不变。感谢您的澄清!!