試圖從用戶輸入中捕獲兩個字符和換行符。
該程式將 3 個 helloworld 列印到螢屏上,然后用戶可以輸入一些字符。一切似乎都有效,但它不列印輸入
我懷疑是因為我在 _read 函式中對 X1 暫存器的操作方式,或者緩沖區的分配方式
運行代碼時沒有報錯。
代碼使用以下命令編譯。它應該在 Mac M1 上運行
as HelloWorld.s -o HelloWorld.o && ld -macosx_version_min 12.0.0 -o HelloWorld HelloWorld.o -lSystem -syslibroot `xcrun -sdk macosx --show-sdk-path` -e _start -arch arm64 && ./HelloWorld
//HelloWorld.s
.equ SYS_WRITE, 4
.equ SYS_READ, 3
.equ NEWLN, 10
.global _start // Provide program starting address to linker
.align 2
// Setup the parameters to print hello world
// and then call Linux to do it.
_start:
adr X4, helloworld1
mov X1, X4
bl _sizeof
bl _print
adr X4, helloworld2
mov X1, X4
bl _sizeof
bl _print
adr X4, helloworld3
mov X1, X4
bl _sizeof
bl _print
bl _read
//mov X2, 4
// bl _sizeof
bl _print
_exit:
mov X0, X2 // Use 0 return code
mov X16, #1 // Service command code 1 terminates this program
svc 0 // Call MacOS to terminate the program
_sizeof: //X1 = address, X2 = out length, string must terminate with \n
str LR, [SP, #-16]! //Store registers
//str W0, [SP, #-16]!
mov X2, #0
__loop:
ldrb W0, [X1, X2] //load a byte into W0 (32 bit)
add X2, X2, #1 //Add 1 offset
cmp W0, NEWLN //Compare byte with \n return
bne __loop
//ldr W0, [SP], #16
ldr LR, [SP], #16 //Load registers
ret
_print: //X2 = length, X1 = address
str LR, [SP, #-16]! //Store registers
mov X0, #1 // 1 = StdOut
// mov X1, X1 // string to print
// mov X2, X2 // length of string
mov X16, SYS_WRITE // MacOS write system call
svc 0 // Call kernel to output the string
ldr LR, [SP], #16 //Load registers
ret
_read:
//3 AUE_NULL ALL { user_ssize_t read(int fd, user_addr_t cbuf, user_size_t nbyte); }
str LR, [SP, #-16]! //Store registers
adr X1, msg
mov X0, #0 // 0 = StdIn
ldr X1, [x1] // address to store string
mov X2, #4 // length
mov X16, SYS_READ // MacOS read system call
svc 0 // Call system
ldr LR, [SP], #16 //Load registers
ret
msg: .ds 4 //memory buffer for keyboard input
helloworld1: .ascii "Hello World\n"
helloworld2: .ascii "Happy new year for 2022\n"
helloworld3: .ascii "Welcome to AARCH64 assembly on Mac Silicon\n"
uj5u.com熱心網友回復:
首先,您需要移動msg到可寫段:
.data
msg: .ds 4 //memory buffer for keyboard input
.text // keep everything else in __TEXT
然后,由于段可能在鏈接時任意移動,Apple 的工具鏈將不再允許您使用adr來獲取該緩沖區的地址 - 您將不得不使用adrpand add:
adrp x1, msg@page
add x1, x1, msg@pageoff
如果您愿意,您可以告訴聯結器請adr盡可能將其優化回:
Lloh0:
adrp x1, msg@page
Lloh1:
add x1, x1, msg@pageoff
.loh AdrpAdd Lloh0, Lloh1
然后你需要洗掉這一行:
ldr X1, [x1]
這將加載緩沖區的內容,這只是空位元組。
最后,您應該將x0值更改exit為常量:
mov x0, 0
此時 in 的值x2將被破壞,無論如何您都不需要它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/405182.html
標籤:
