【问题标题】:jg not working properly in asmjg 在 asm 中无法正常工作
【发布时间】:2015-02-23 05:53:16
【问题描述】:
section .data
msg db 'Largest number :: '
len equ $ - msg
num1 dd '47'
num2 dd '51'
num3 dd '22'

section .bss
largest resb 2

section .text
global _start

_start:

mov ecx, [num1]
cmp ecx, [num2]
jg check_third
mov ecx, [num2]
check_third:

cmp ecx, [num3]
jg _exit
mov ecx, [num3]

_exit:
mov [largest], ecx

mov edx, len
mov ecx, msg
mov ebx, 1
mov eax, 4
int 0x80

mov edx, 2
mov ecx, largest
mov ebx, 1
mov eax, 4
int 0x80

mov eax, 1
int 0x80

答案是 47,而它必须是 51

【问题讨论】:

  • largest 需要为 4 个字节。

标签: assembly nasm


【解决方案1】:

您已将数字声明为一堆字符串。删除引号以获得正确的比较:

num1 dd 47
num2 dd 51
num3 dd 22

请记住,当您想要打印结果时,您必须将结果转换为字符串。


要了解为什么将数字作为字符串没有意义,请考虑这些字符串是如何存储在内存中的:'51' 由字符序列 '5','1' 组成(即 '5' 存储在 @987654325 之前@,因为它是字符串的第一个字符)。 '5','1'0x35,0x31 相同,与0x3135 相同。
如果我们以获取0x3734 的方式查看'47',那么现在应该很清楚,cmp 在这些上是行不通的。

【讨论】:

  • 那么根据你的解决方案必须是什么?
  • 我在回答中所说的:"删除引号以正确进行比较""您必须将结果转换为字符串想打印”。正如评论者指出的那样,largest 需要 4 个字节”.
  • 使最大的 4 个字节不起作用,您早期的解决方案听起来不错,我相信它会起作用,但我找不到将两位数转换为字符串的方法,因为单个数字可以通过添加“0”进行转换。但是如何处理两位数。
猜你喜欢
  • 1970-01-01
  • 2016-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-14
  • 2021-04-08
  • 2018-07-14
相关资源
最近更新 更多