2015-02-23 24 views
0
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,而它得出來的是51JG不ASM正常工作

+0

'最大'需要4個字節。 – 2015-02-23 06:43:37

回答

0

你宣佈你的號碼是一串字符串。刪除引號,以獲得比較合適的:

num1 dd 47 
num2 dd 51 
num3 dd 22 

請記住,當你想打印出來,你必須將結果轉換爲字符串。


要明白爲什麼它沒有意義有數字爲字符串,考慮這些字符串是如何存儲在內存中:'51「由字符序列'5','1'(即'5''1'之前存儲,因爲它是字符串的第一個字符)。 '5','1'0x35,0x31相同,與0x3135相同。
如果我們查看'47'與我們獲得0x3734相同的方式,現在應該清楚cmp在這些上不起作用。

+0

那麼根據你的解決方案是什麼? – 2015-03-16 05:07:53

+0

我在回答中說過:_「刪除引號以正確比較」_和_「當您要打印結果時,必須將結果轉換爲字符串」_。正如一位評論者指出的那樣,「最大的」需要是4個字節。 – Michael 2015-03-16 08:06:27

+0

使最大的4個字節不能正常工作,你以前的解決方案聽起來不錯,我相信它會工作,但我找不到一種方法將兩位數字轉換爲字符串,因爲可以通過添加'0'來轉換單個數字號碼, 。但如何做一個兩位數的數字。 – 2015-04-15 08:29:09