簡體   English   中英

將 C 代碼轉換為 x86-64 位程序集?

[英]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 標准庫,直到你掌握它的竅門。 readwrite有太多的陷阱。 您將需要編寫一次它們並將它們包含在您進行的任何更多組裝工作中的迷你庫中。

我們可以通過從命令行中取出參數來跳過read ,如下所示:

    mov rbx, [rsp + 16] ; argv[1]

除非我大錯特錯,堆棧上的第一件事是argc ,然后是argv[0] ,然后是argv[1] ,...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM