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應用於兩個數字時,爲什麼總是得到一個值?
你不能用'RESB 1'對於打算持有超過1個字節(如'num1','num2'和'水庫東西')。 – Michael
我打算讓他們保存一個字節,因爲我希望他們是一個字符/數字。 – Swarage
那麼,你的代碼另有說明。例如:'mov [res],eax' – Michael