在NASM编程中将数据从变量移动到寄存器

时间:2018-03-30 15:53:45

标签: assembly nasm x86-64

以下是将数据部分中初始化的两个数字相乘为“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

1 个答案:

答案 0 :(得分:1)

在64位模式下,循环使用rcx,而不是cx。 Mov cx,[buff2]只写cx - rcx的低16位。

使用movzx ecx,word [buff2]。这会初始化整个寄存器。 (低16位加载buff2的内容,寄存器的其余部分为0.)所以你之前不需要mov rcx,0。