首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >64位NASM编程中的装配编程基础

64位NASM编程中的装配编程基础
EN

Stack Overflow用户
提问于 2018-03-28 18:17:44
回答 1查看 820关注 0票数 0

我对程序集编程很陌生,我试图解释以下代码,在其中我必须打印.data部分中的数组:下面是代码:

代码语言:javascript
复制
%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


section .data

    msg db 10,"Array is : ",10
    len equ $-msg   

    array dq 11234H, 0AB32H, -3326H, 056BH

    newline db 10

section .bss

    buff resb 16;

section .code
global _start
_start:
    print msg,len
    mov rsi,array
    mov rcx,4
    back:
        mov rbx,[rsi]
        push rsi
        push rcx
        call HextoASCII
        print newline,1
        pop rcx
        pop rsi
        add rsi,8
    loop back

    exit


HextoASCII:
    mov rsi,buff
    mov rcx,16
    back1:
        rol rbx,4
        mov al,bl
        and al,0fh
        cmp al,9h
        jbe add_30h
        add al,7h
        add_30h:
            add al,30h

        mov [rsi],al
        inc rsi
    loop back1
    print buff,16
ret

我有几个问题要问,以澄清我的疑虑:

  1. .bss部分中的变量的默认值是什么?
  2. msg的大小是10字节( msg的最大大小),但是当我在其中添加更多的字符时,即使字符串大小超过其最大限制(10字节),它仍然会打印整个msg。
  3. 如果数组中给出的数字的最后一个(最高有效位数)为非零,这不意味着这个数字是负的,即在数组中不是11234H是负数,因为我假设内存中的最高有效位是1 (FFF11234H)。我认为,如果一个数字是非负的,它的最高数字必须是零(011234),这样更高的有序位被存储为0在内存中,并使数字为正。如果我错了,那么另一个要问的问题是FFFFFFFFH是-1还是一个大的正数。
  4. 我被这个指令弄糊涂了

rsi公司

据说rsi增加了1,但是这里的1是位还是字节,或者是8字节(rsi的大小)。

  1. 添加30H或37H将十六进制数字转换为39H或41H,这是ASCII中9和A的十六进制表示,但我不明白为什么在我的显示器上打印39H或41H会产生结果9或A,而不是39H或41H本身。不管我们的结果是什么,汇编程序都会在监视器上打印它的ASCII等价物。另外,我们通过键盘给出的输入是由汇编程序/机器解释的,如果是ASCII,那么我是否需要显式地将它转换回HEX以供以后的计算?
  2. 在加入30H或37H后,单位数字(0H-9H或AH)被转换为30H-39H和4H-46H之间的两位数,所以当我们将其移至buff时,它是否会在转换后占用阵列元件的两倍大小来存储呢?我假设前面的数字是4位,现在在转换后需要8位(9h是4位,39h是8位)。如果我错了,请纠正我。如果我是对的,那就是为什么当每个数组元素大小仅为8字节(四字)时,buff被取为16字节。
  3. 我理解HextoASCII的逻辑,它取数字中最高的数字,并将其存储在buff中,然后buff就会被打印出来,但是不会以相反的方式打印这个数字,因为阵列元素的最高数字存储在buff的最不重要位置,并且随着rsi的增加,下一个数字将被添加到buff的较高位置,所以如果我们打印buff,那么最重要的数字就会被放置在最不重要的缓冲器位置。例如,12H存储为21,因为1首先存储在buff中,然后2被存储。在这里存储数字有什么重要的小终端和大终端吗?如果是的话,请解释。
  4. 在打印宏中,第二个参数总是printed.Here变量的大小,buff的大小是16个字节,因此第二个参数是16。但是如果我将第二个参数设为8,那么为什么没有打印每个数组元素的数字的一半,但仍在打印整个8位数字。另外,给我一个例子,每一个数组元素的一半数字将被打印出来,在这种情况下,会打印更高的4位数字还是打印较低的4位数?还有,为什么?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-28 18:45:32

  1. 零。
  2. 10不是msg的大小。那些只是嵌入的行提要。大小计算为len equ $-msg,因此将始终与您提供的文本长度相匹配。
  3. 根据大小,符号位是最重要的位。因为你有qword,所以11234H0000000000011234H,并且是正的。FFFFFFFFH是一个很大的正数。FFFFFFFFFFFFFFFFH可能是更大的数字或-1,这取决于您是将它解释为无符号还是签名。
  4. 没什么,只是1。它只是在rsi中添加一个值。当以后用作地址时,这将意味着1字节。
  5. 这仅仅是因为您的终端使用ascii代码,因此将打印0值为30h (以此类推)。是的,如果您读取文本,您将需要从ascii转换为二进制。
  6. 这是正确的。
  7. 你正确地描述了它,但这并不是相反的。人类首先从最重要的数字开始。因此,代码将其放在第一位并递增rsi以将其他数字放在后面是有意义的。不知道为什么你认为这是相反的。
  8. 因为每个数组元素分别调用print,因此缩短输出适用于每个元素,而不是整个输出。当然,这将是更高的数字,因为这就是他们在记忆中的表现。见上文第7点。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49541502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档