[英]Converting C code to x86-64 bit Assembly?
我正在嘗試為我的字符串創建一個隨機字母生成器,並且我得到了一個 C 代碼,並且必須將其轉換為我的程序的匯編語言。 我正在x86-64 位 NASM 匯編語言中執行此操作。 我應該只使用系統調用而不是 C/C++ 函數調用。 這是我必須轉換的 C/C++ 代碼:
int genran(int x,int y)
{
int a = 0;
a = a + x * 1103515245 + 12345;
return (unsigned int)(a / 65536) % (y + 1);
}
我是大會的新手,任何幫助表示贊賞,這是我到目前為止所得到的。 我知道它有點錯誤,但我會努力改進它:
section .data
string db "The random string is generated below: "
len_string equ $-string
a dd 0
x dd ?
y dd ?
rem dd 0
section .bss
string_buff resb 21 ;Our string's length is 20 characters
section .txt
global main
main:
mov rax, 1
mov rdi, 1
mov rsi, string
mov rdx, len_string
syscall
mov rax, a
mov rbx, x ;we have to come up with a value of x?
mul rbx, 1103515245
add rbx, 12345
mov rax, rbx
div rax, 65536
mov rdx, y ;we have to come up with a value of y?
add rdx, 1
;mod rax, rdx
;ret
exit:
mov rax, 60
xor rdi, rdi
syscall
mov rax, rbx
div rax, 65536
請閱讀說明; 這不存在。 div
是一種只接受一個參數的操作碼。 代碼應該看起來像
mov rax, rbx
xor rdx, rdx ; Div takes rdx:rax as an implicit 128 bit argument.
mov rcx, 65536
div rcx
在這個技能水平上,我不建議嘗試使用read
或寫入系統調用。 我非常推薦調用 C 標准庫,直到你掌握它的竅門。 read
和write
有太多的陷阱。 您將需要編寫一次它們並將它們包含在您進行的任何更多組裝工作中的迷你庫中。
我們可以通過從命令行中取出參數來跳過read
,如下所示:
mov rbx, [rsp + 16] ; argv[1]
除非我大錯特錯,堆棧上的第一件事是argc
,然后是argv[0]
,然后是argv[1]
,...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.