Untitled

mail@pastecode.io avatar
unknown
plain_text
2 years ago
4.3 kB
2
Indexable
Never
===========BAI1=============

section .data
msg: db "syscall1_64.asm running",10; the string to print,
10=crlf
len: equ $-msg ; "$" means here, len is a value, not an address
msg2: db "syscall1_64.asm finished",10
len2: equ $-msg2
msg3: db "syscall1_64.asm opened",10
len3: equ $-msg3
msg4: db "syscall1_64.asm read",10
len4: equ $-msg4
msg5: db "syscall1_64.asm open fail",10
len5: equ $-msg5
msg6: db "syscall1_64.asm another open fail",10
len6: equ $-msg6
msg7: db "syscall1_64.asm read fail",10
len7: equ $-msg7
name: db "syscall1_64.asm",0 ; "C" string also used by OS
fd: dq 0 ; file descriptor
flags: dq 0 ; hopefully read-only
section .bss
line: resb 8193 ; read/write buffer 16 sectors of 512
lenbuf: resq 1 ; number of bytes read
extern open
global main
section .text
main:
 push rbp ; set up stack frame
; header msg
mov rdx,len ; arg3, length of string to print
mov rcx,msg ; arg2, pointer to string
mov rbx,1 ; arg1, where to write, screen
mov rax,4 ; write command to int 80 hex
int 0x80 ; interrupt 80 hex, call kernel
open1:
mov rdx,0 ; mode
mov rcx,0 ; flags, 'r' equivalent O_RDONLY
mov rbx,name ; file name to open
mov rax,5 ; open command to int 80 hex
int 0x80 ; interrupt 80 hex, call kernel
 mov [fd],rax ; save fd
cmp rax,2 ; test for fail
jg read ; file open
; file open failed msg5
mov rdx,len5 ; arg3, length of string to print
mov rcx,msg5 ; arg2, pointer to string
mov rbx,1 ; arg1, where to write, screen
mov rax,4 ; write command to int 80 hex
int 0x80 ; interrupt 80 hex, call kernel
read:
; file opened msg3
mov rdx,len3 ; arg3, length of string to print
mov rcx,msg3 ; arg2, pointer to string
mov rbx,1 ; arg1, where to write, screen
mov rax,4 ; write command to int 80 hex
int 0x80 ; interrupt 80 hex, call kernel
doread:
mov rdx,8192 ; max to read
mov rcx,line ; buffer
mov rbx,[fd] ; fd
mov rax,3 ; read command to int 80 hex
int 0x80 ; interrupt 80 hex, call kernel
mov [lenbuf],rax ; number of characters read
cmp rax,0 ; test for fail
jg readok ; some read
; read failed msg7
mov rdx,len7 ; arg3, length of string to print
mov rcx,msg7 ; arg2, pointer to string
mov rbx,1 ; arg1, where to write, screen
mov rax,4 ; write command to int 80 hex
int 0x80 ; interrupt 80 hex, call kernel
jmp fail ; nothing read
; file read msg4
readok:
mov rdx,len4 ; arg3, length of string to print
mov rcx,msg4 ; arg2, pointer to string
mov rbx,1 ; arg1, where to write, screen
mov rax,4 ; write command to int 80 hex
int 0x80 ; interrupt 80 hex, call kernel
write:
mov rdx,[lenbuf] ; length of string to print
mov rcx,line ; pointer to string
mov rbx,1 ; where to write, screen
mov rax,4 ; write command to int 80 hex
int 0x80 ; interrupt 80 hex, call kernel
fail:
; finished msg2
mov rdx,len2 ; arg3, length of string to print
mov rcx,msg2 ; arg2, pointer to string
mov rbx,1 ; arg1, where to write, screen
mov rax,4 ; write command to int 80 hex
int 0x80 ; interrupt 80 hex, call kernel
mov rbx,0 ; exit code, 0=normal
mov rax,1 ; exit command to kernel
int 0x80 ; interrupt 80 hex, call kernel


===========BAI2===================

%assign SYS_EXIT 1
%assign READ 3
%assign WRITE 4
%assign STDOUT 1
%assign STDIN 0
%assign ENDL 0x0a

;; -------------------------
;; data segment
;; -------------------------
section .data
msg db "hello"
 db ENDL
MSGLEN equ 6
strEnd: db '\0' ;; 0x00
section .bss
inmsg: resb 255
inlen: resd 1

;; -------------------------
;; code area
;; -------------------------
section .text
global _start
_start:
mov eax,WRITE ;4
 mov ebx,STDOUT ;1
 lea ecx,[msg] ;address of source
 mov edx,MSGLEN ; length (num of characters)
 int 0x80
mov edi, 1
mov byte [inmsg], 0 ;init with end of string for the loop
nxtchr: cmp byte[inmsg + edi - 1], ENDL
je endlp
mov eax, READ ; 3 place READ value in eax instead of WRITE
mov ebx, STDIN ; 0 place STDIN value in ebx instead of
STDOUT
lea ecx, [inmsg + edi] ; address of destination
mov edx, 1 ; length (num of char)
int 0x80
inc edi
jmp nxtchr
mov ecx, -1
loopit: inc ecx
mov al, [inmsg + ecx]
cmp al, [strEnd]
JE endlp
cmp al, 0x41
JB loopit
cmp al, 0x5A
JAE loopit
add al, 0x20
mov [inmsg + ecx], al
jmp loopit
endlp: mov eax, WRITE ; write the input string back out
mov ebx, STDOUT
lea ecx, [inmsg]
mov edx, edi ; edi now contains the string length
int 0x80
;; exit()
mov eax,SYS_EXIT
mov ebx,0
int 0x80 ; final system call