Compare commits

..

No commits in common. "main" and "ad9f04fcc4970a7ce2df01016e456a11590c5994" have entirely different histories.

19 changed files with 40 additions and 107 deletions

1
.gitignore vendored
View File

@ -2,4 +2,3 @@
*.pdb
*.obj
*sublime-workspace
*.exe

View File

@ -1,8 +0,0 @@
This repo is me working through the book The Art of 64 Bit Assembly.
To build listings in the `src/` folder simply call the `build.bat`
script with the listing number:
```batch
build 1_8 // don't add .asm extension
```

BIN
a.exe Normal file

Binary file not shown.

BIN
program.exe Normal file

Binary file not shown.

View File

@ -1,13 +0,0 @@
.CODE
option casemap:none ; make all symbols case sensitive (like C)
public asm_func ; make this visible outside of this source
asm_func PROC ; start procedure
ret
asm_func ENDP ; end procedure
END

View File

@ -1,15 +0,0 @@
; a user defined proc
.code
asm_proc proc
ret ; return from the procedure
asm_proc endp
main proc ; the main procedure
call asm_proc ; call our proc
ret
main endp
end

View File

@ -1,21 +0,0 @@
option casemap:none
.data
fmt_str byte 'Hello World!', 10, 0 ; here 10 is the newline feed
.code
externdef printf:proc
public asm_func
asm_func proc
sub rsp, 56
lea rcx, fmt_str ; load the format string into the RCX register to be used by the printf
call printf
add rsp, 56
ret
asm_func endp
end

View File

@ -1,61 +1,61 @@
; assembly that shows how to return values to a
; a C function
option casemap:none
; constants
nl = 10 ; newline
maxlen = 256 ; max len of the string
nl = 10
maxlen = 256
.data
title_string byte 'Listing 1_8', 0
prompt_string byte 'Enter a string: ', 0
format_string byte 'User entered: "%s" ', nl, 0
title_str byte "Listing 1-8", 0
prompt byte "Enter a string: ", 0
fmt_string byte "User entered: '%s'", nl, 0
; make `maxlen` copies/duplicates of size byte, each uinitialized
input byte maxlen dup (?)
input byte maxlen dup (?) ; make maxlen copies of byte, each uninitialized
.code
externdef printf:proc
externdef readline:proc
;; get_title procedure -------------------------
;; get_title moves the address of the byte containing the string "Listing 1_8", 0
;; into the RAX register, it does this usig the LEA instruction
public get_title
; procedure loads the address of the title_str into the RAX
; register, this is the register where C expects to find
; the return of this proc. (WINDOWS ABI)
get_title proc
lea rax, title_string ; load address of title_string into rax
ret
lea rax, title_str ; load address of title string in RAX register
ret
get_title endp
; ASM Main function
public asm_main
asm_main proc
asm_main proc
sub rsp, 56
sub rsp, 56
lea rcx, prompt ; load prompt string address into RCX register
call printf ; this is the reigster where ABI tells us to place arguments
;; first we want to print a prompt, to do this we use the stdio function printf,
;; we need to make the arguments for printf avaialble by loading the address of the
;; byte prompt_string into RCX
lea rcx, prompt_string
call printf
mov input, 0 ; ensure the input string is terminated with 0
mov input, 0 ;; clear the input
lea rcx, input ; load input address to rcx register
mov rdx, maxlen ; move maxlen into rdx register
call readline ; use rcx and rdx as arguments to call readline
; read user input by calling readline from out cpp program. We load the required
; arguments into the registers RCX, and RDX and then call readline
lea rcx, input
mov rdx, maxlen
call readline
lea rcx, fmt_string
lea rdx, input
call printf
; load RCX and RDX with arugments to printf, to print back to the user
lea rcx, format_string
lea rdx, input
call printf
add rsp, 56
add rsp, 56
ret
asm_main endp
end
end

BIN
src/1_8.exe Normal file

Binary file not shown.

BIN
src/2_2.exe Normal file

Binary file not shown.

View File

@ -7,7 +7,7 @@ maxlen = 256
.data
title_str byte 'listing 2_3',0
title_str byte "listing 2-3", 0
init_prompt byte "enter an integer between 0-127: ", 0
fmt_str1 byte "the value in hexadecimal: %x", nl, 0
@ -27,7 +27,7 @@ input byte maxlen dup (?)
public get_title
get_title PROC
lea rax, title_str
lea rcx, title_str
ret
get_title ENDP

BIN
src/a.exe Normal file

Binary file not shown.

View File

@ -1,9 +1,4 @@
@echo off
echo ~~~~ starting build ~~~~
REM /nolog is dont show MS info at run
REM /c is compile dont link
REM /Zi is debug info
REM /Cp is preserve cases
ml64 /nologo /c /Zi /Cp %1.asm
cl /nologo /O2 /Zi /utf-8 /EHa /Fe%1.exe c.cpp %1.obj

View File

@ -8,7 +8,7 @@ extern "C"
{
void asm_main(void);
// function is defined in the asm file
char *get_title(void);
int readline(char* dest, int maxlen);

BIN
src/c.exe Normal file

Binary file not shown.

View File

@ -1 +0,0 @@
listing_1_9.cpp

View File

@ -2,15 +2,12 @@
extern "C"
{
// Function written in ASM
void asm_func(void);
}
void asm_func(void);
};
int main()
int main(void)
{
printf("calling asm function\n");
printf("calling asm main\n");
asm_func();
printf("returned from asm function\n");
return(0);
printf("return from asm main\n");
}

BIN
src/main.exe Normal file

Binary file not shown.

Binary file not shown.