Nasm 为什么a部分后的输出是“a”@&引用;象征?

Nasm 为什么a部分后的输出是“a”@&引用;象征?,nasm,Nasm,我试着输入3个间隔的数字,格式是:4 2 2 将前两个数字相除,然后与剩余数字相乘。当我尝试将这两个数字(dig1和dig2)分开时,会得到一个“@”符号。我怎样才能让它打印出答案(2) 下面是输出的图片(请注意,4 2成功输出 在执行div之前,寄存器是这样的: $eax:0x2004 $ebx:0x2002 $ecx:0x0804a020→ 0x00000a32(“2\n”) $edx:0x2 前导的20是从您与数字一起读入的空格。在div之后,eax保持0x10,然后您向其添加0x30

我试着输入3个间隔的数字,格式是:4 2 2

将前两个数字相除,然后与剩余数字相乘。当我尝试将这两个数字(dig1和dig2)分开时,会得到一个“@”符号。我怎样才能让它打印出答案(2)

下面是输出的图片(请注意,4 2成功输出


在执行
div
之前,寄存器是这样的:

$eax:0x2004
$ebx:0x2002
$ecx:0x0804a020→ 0x00000a32(“2\n”)
$edx:0x2

前导的20是从您与数字一起读入的空格。在
div
之后,
eax
保持
0x10
,然后您向其添加
0x30
,使其
0x40
0x40
的ASCII代码

要解决这个问题,您可以进行单独的读取以丢弃空格,一次只读取一个字符,或者像现在这样读取空格,然后在进行数学运算之前清除单词顶部以从寄存器中删除空格



如果您还没有使用它,像GDB这样的调试器是至关重要的。获取GDB,然后可能使用像GEF这样的附加组件来稍微清理输出。

要获得正确答案,就在
div
之前,您需要:

  • 过滤掉
    AX
    中的多余空格字符
  • 过滤掉
    BX
    中的多余空格字符,然后
  • 归零
    DX
它的评论提到了为什么以及如何做到前两个。我将试图解释为什么需要最后一个

根据,您使用的是
DIV r/m16
版本(这里,
r/m16
大致意思是
16位寄存器或16位内存内容,您使用的是16位寄存器
BX
),它表示
无符号除以DX:AX除以r/m16,结果存储在AX中← 商← 余数
。换句话说,
div
带来了
DX
AX
,连接起来形成一个32位数字,然后除以
r/m16
(=
BX


通过调零
DX
,16位无符号数
AX
的数量与32位无符号数的数量保持不变
DX:AX

谢谢,作业需要空格。我该如何清除单词的顶部?我也尝试过在MacBook上编译NASM,但它不起作用。GDB是否可以在IOS上运行?我很犹豫因为我还在学习自己,所以我在那里给大家提建议。
和ax,0x00FF
可以只保留较低的8位(每个
F
4位)。我不认为这有任何缺点。我假设Mac有GDB版本。如果没有,就有一些调试器可用(必须有).我现在添加了填充输入以清除空格,但是,在除以4/2后,我得到了“6”作为输出…现在我更困惑的是,如何过滤掉多余的空格字符,这是否与将DX(本质上是mov DX)归零相同,0@jameson::对于过滤掉空格字符。是的,调零意味着
mov-DX,0
section .data

msg db  'Enter three numbers to !',0xa  ;our dear string
len equ $ - msg     

section .bss 
dig1 resb 2
dig2 resb 2
dig3 resb 2
filler resb 1
res resb 1

section .text
    global _start       
_start:                   
;dig1 input
mov eax, 3
mov ebx, 0
mov ecx, dig1
mov edx, 2
int 0x80

;dig1 output
mov eax, 4
mov ebx, 1
mov ecx, dig1
mov edx, 2
int 0x80

;dig2 input
mov eax, 3
mov ebx, 0
mov ecx, dig2
mov edx, 2
int 0x80

;dig2 output
mov eax, 4
mov ebx, 1
mov ecx, dig2
mov edx, 2
int 0x80

;dig3 input
mov eax, 3
mov ebx, 0
mov ecx, dig3
mov edx, 2
int 0x80


;dig3 output
mov eax, 4
mov ebx, 1
mov ecx, dig3
mov edx, 2
int 0x80

;divide first digits
mov ax, [dig1]
sub ax, '0'
mov bx, [dig2]
sub bx, '0'
div bx
add ax, '0'
mov [res], ax
sub ax, '0'



mov eax, 4
mov ebx, 1
mov ecx, res
mov edx, 1
int 0x80

;System exit
mov eax, 1
mov ebx, 0
int 0x80