NASM中汇编编程的基础知识

时间:2018-03-29 14:59:29

标签: assembly nasm

我是汇编编程的初学者,想澄清一些在解释这段代码时引起的疑惑

%macro print 2
    mov rax,1
    mov rdi,1
    mov rsi,%1
    mov rdx,%2
    syscall
%endmacro   
%macro exit 0
    mov rax,60
    mov rdi,0
    syscall
%endmacro
%macro accept 2
    mov rax,0
    mov rdi,0
    mov rsi,%1
    mov rdx,%2
    syscall
%endmacro
section .data

    a dw 123AH



section .bss
    b resb 2;       
    buff resb 2;

section .code
global _start
_start:
    accept b,2
    mov rsi,a           ;3
    mov rbx,[rsi]           ;6
    call hextoascii
    mov rsi,buff
    exit
hextoascii:
    mov rcx,4
    mov rsi,buff
    back:
        rol bx,4
        mov al,bl
        and al,0Fh
        cmp al,09H
        jbe add30h
        add al,7h
        add30h:
            add al,30h
        mov [rsi],al
        inc rsi         ;4
    loop back
    print buff,2            ;7


ret

我有几个问题要问:

  1. 以下两者在存储器或其他存储器中的存储方面是否有任何区别 a)res res 2 b)resw 1
  2. 如果我接受来自用户的变量,那么我必须为"输入"保留另一个字节。按键。是这样吗 ?如果是,则ascii值为"输入"被连接为变量的最后一个字节?
  3. 指令:mov rsi,a(a = 1234H) ' a'到哪个内存位置? rsi指向吗? ie-它是否存储地址4或地址1。

  4. 如果我增加rsi那么它会指向变量a的下一个数字吗?我该如何解释" inc rsi"在代码的第4行? 假设rsi当前指向" a"的基地址,则rsi增加多少位置。 ?并且增量是否取决于它指向的变量的大小?

  5. ' a'存在于记忆中? ie- 1是出现在最低地址还是出现在最高地址相对于其他数字?

  6. 在说明中:mov rbx,[rsi] 多少' a'进入rbx,' a'的最大限制是什么? rbx可以存储在里面吗?

  7. 在指令中:print buff,4 它打印的价值只有' a' (12)而不是' 1234'完全。我已经读过打印宏的第二个参数应该是变量的大小(这里是' buff')但是因为buff的大小是2个字节,所以它只是打印一半而不是完全打印。相反,如果我将2替换为4,那么完成“1234”'得到印刷。尺寸意味着什么?是不是。字节或其他东西?

1 个答案:

答案 0 :(得分:2)

  1. 没有
  2. x86是小端,因此第一个字节是最不重要的字节,即34h
  3. 不,十六进制数字是4位(半字节)。您只能指向字节。 inc rsi递增1,当用作地址时为1个字节。
  4. 见上文第3点。
  5. 由于您要加载到rbx这是一个64位的寄存器,这就是您将获得多少。
  6. 要打印的文本的长度。代码被破坏,因为它将4个字节写入2个字节的缓冲区。