2013-12-10 49 views
0
SYS_EXIT equ 1 
SYS_READ equ 3 
SYS_WRITE equ 4 
STDIN  equ 0 
STDOUT equ 1 

segment .data 

    msg1 db "Enter two digits: ", 0xA,0xD 
    len1 equ $- msg1 

    msg2 db "Result: ", 0xA,0xD 
    len2 equ $- msg2 

segment .bss 

    num1 resb 1 
    num2 resb 1 
    res resb 1 

segment .text 
    global _start 
_start: 
    ; disp msg 
    mov eax, SYS_WRITE   
    mov ebx, STDOUT   
    mov ecx, msg1   
    mov edx, len1 
    int 0x80 

    ; enter num1 
    mov eax, SYS_READ 
    mov ebx, STDIN 
    mov ecx, num1 
    mov edx, 2 
    int 0x80 

    ; print num1 
    mov eax, SYS_WRITE   
    mov ebx, STDOUT   
    mov ecx, num1   
    mov edx, 2 
    int 0x80 

    ; enter num2 
    mov eax, SYS_READ 
    mov ebx, STDIN 
    mov ecx, num2 
    mov edx, 2 
    int 0x80 

    ; print num2 
    mov eax, SYS_WRITE   
    mov ebx, STDOUT   
    mov ecx, num2   
    mov edx, 2 
    int 0x80 

    ; move first to eax, second to ebx 
    mov eax, num1 
    sub eax, byte '0' 
    mov ebx, num2 
    sub ebx, byte '0' 

    ; or them and store the result in eax, and then eax in res 
    or eax, ebx 
    add eax, byte '0' 
    mov [res], eax 

    ; disp result msg 
    mov eax, SYS_WRITE   
    mov ebx, STDOUT   
    mov ecx, msg2   
    mov edx, len2 
    int 0x80 

    ; write result 
    mov eax, SYS_WRITE   
    mov ebx, STDOUT   
    mov ecx, res   
    mov edx, 1 
    int 0x80 
outprog: 
    mov eax,1    ;system call number (sys_exit) 
    int 0x80    ;call kernel 

在上面的代碼段中,我希望將兩個數字作爲輸入或它們,並顯示結果。但是,當我編譯並運行此代碼時,無論我給程序哪個輸入,程序總是返回字符]。我在裝配中編程相當新,我不完全確定這是爲什麼會發生。我已經做了一些研究,發現]的ascii值是(按dec,十六進制):93,5D,但是,我不知道該字符與我寫的代碼有什麼關聯。對於爲什麼會發生這種情況的任何解釋以及關於如何避免將來出現這種錯誤的建議都是非常棒的。將組合操作OR應用於兩個數字時,爲什麼總是得到一個值?

+0

你不能用'RESB 1'對於打算持有超過1個字節(如'num1','num2'和'水庫東西')。 – Michael

+0

我打算讓他們保存一個字節,因爲我希望他們是一個字符/數字。 – Swarage

+0

那麼,你的代碼另有說明。例如:'mov [res],eax' – Michael

回答

0

[問題解決了]我不得不改變mov eax, num1mov eax, [num1]

相關問題