相关疑难解决方法(0)

如何解释 x86-64 xor 后跟 jle?

如果部分汇编代码如下:

xor %ebp,%ebx
jle some address
Run Code Online (Sandbox Code Playgroud)

这个 jle 是否意味着它会在 (%ebx ^ %ebp == 0) 时跳转,因为这会将 ZF 设置为 1?

x86 assembly x86-64 eflags

4
推荐指数
1
解决办法
176
查看次数

以美元结尾的字符串

在我的汇编语言类中,我们的第一个任务是编写一个程序,在DOS中打印出一个简单的以美元结尾的字符串.它看起来像这样:

BITS 32
    global _main

section .data
    msg db "Hello, world!", 13, 10, ’$’

section .text
_main:
mov ah, 9
mov edx, msg
int 21h
ret
Run Code Online (Sandbox Code Playgroud)

据我了解,$符号用来像空确实在C.但是,我该怎么办,如果我想要把一个美元符号字符串中终止刺(像我想打印出"它的成本$ 30")?这似乎是一个简单的问题,但我的教授不知道答案,我似乎没有使用谷歌搜索找到它.

console assembly dos nasm

3
推荐指数
1
解决办法
3710
查看次数

Mac OSX 64 位程序集 - fork() test/jne 不起作用?

我正在尝试编写一个执行fork()系统调用的程序,并且子/父项分别写入不同的字符串和exit(0).

问题是 - 虽然fork()成功了(因为我看到了 2 行输出),但由于某种原因,父进程和子进程都输出了父字符串。

这是代码:

BITS 64

section .data
msg1:    db    "Hello from child", 0x0a
len1:    equ   $-msg1
msg2:    db    "Hello from parent", 0x0a
len2:    equ   $-msg2

section .text
global start

start:
        xor rax,rax
        mov rax,0x2000002    ; fork() syscall
        syscall

        test eax,eax
        jne flow_parent

        mov rax, 0x2000004   ; SYS_write
        mov rdi, 1           ; stdout
        mov rsi, msg1
        mov rdx, len1
        syscall

        xor rdi,rdi
        mov rax,0x2000001
        syscall

flow_parent:
        mov rax, 0x2000004   ; SYS_write …
Run Code Online (Sandbox Code Playgroud)

assembly fork x86-64 system-calls shellcode

3
推荐指数
1
解决办法
763
查看次数

NASM与CMP和OR之间的区别

我有两个问题.第一个:'或'与'cmp'有什么区别?我已经看过了两个,看起来他们做了同样的事情.我的第二个问题:做什么

or al, al
Run Code Online (Sandbox Code Playgroud)

意思?它不应该一直返回真(如x == x)吗?

assembly nasm

3
推荐指数
1
解决办法
3479
查看次数

如何在x86_64汇编中检查寄存器是否为零

我正在尝试检查x86_64汇编代码中的值是否为零.我知道这通常包含一个cmp变体后跟一个jmp变体,但我不确定使用的确切说明.

assembly x86-64

3
推荐指数
2
解决办法
2万
查看次数

ASM:“cmp”的操作数类型不匹配

我正在执行 x86 汇编代码,并且不断收到此错误:`cmp's 的操作数类型不匹配

它出现的代码行是:

cmpb %rdi, $0
Run Code Online (Sandbox Code Playgroud)

x86 assembly

3
推荐指数
1
解决办法
2951
查看次数

FASM 将 Hello World 写入控制台,根本不包含任何包含项或依赖项

我见过

Windows下如何用汇编程序编写hello world?

使用 DOS 在 Fasm 中将 hello,world 写入控制台

如何在fasm中写入控制台?

我已经尝试/看到了像这个答案中的 MASM 示例的代码

;---ASM Hello World Win64 MessageBox

extrn MessageBoxA: PROC
extrn ExitProcess: PROC

.data
title db 'Win64', 0
msg db 'Hello World!', 0

.code
main proc
  sub rsp, 28h  
  mov rcx, 0       ; hWnd = HWND_DESKTOP
  lea rdx, msg     ; LPCSTR lpText
  lea r8,  title   ; LPCSTR lpCaption
  mov r9d, 0       ; uType = MB_OK
  call MessageBoxA
  add rsp, 28h  
  mov ecx, eax     ; uExitCode = …
Run Code Online (Sandbox Code Playgroud)

windows assembly x86-64 system-calls fasm

3
推荐指数
2
解决办法
3644
查看次数

如何将HEX转换为DECIMAL?

我计划将X变量转换为十进制.我很难使用turbo汇编程序,你能帮忙吗?

code segment     ;inicio de un segmento unico
assume cs:code,ds:code,ss:code
org 100h       ;localidad de inicio del contador
main  proc     ;procedimiento principal

mov ax,cs
mov ds,ax   ; INICIO 

mov ax, x

mov ah,4ch ;comienzo del fin de programa
int 21h    ;fin del programa

main endp

x dw 0A92FH

code ends   ; fin del segmento de codigo
end main    ;fin del ensamble
Run Code Online (Sandbox Code Playgroud)

非常感谢

assembly tasm

2
推荐指数
1
解决办法
3万
查看次数

如何加快这种插入排序?(C中的内联汇编)

因此,此插入排序是用x86编写的,但嵌入在C中。它还具有一个标志,在对数组的一半进行排序后,我们将其设置为保留。有什么办法可以提高性能?

void asmInsSort(int *list, int arrayLen, int halfpoint) {
 _asm
 {

    mov ecx, arrayLen
    mov esi, list
    mov ebx, halfpoint
    mov eax, 0

    more:
        cmp ecx, 0              // Compare current arrayLen w/ 0
            je  done            // If it is equal, we are done
        mov edi, eax            //J = I
        push eax                //push eax (i) to free up register for key
        mov eax, [esi + edi]    //Key = Array[i] technically j
        sub edi, 4              //J - 1
        mov edx, arrayLen       //K …
Run Code Online (Sandbox Code Playgroud)

x86 assembly inline-assembly micro-optimization insertion-sort

2
推荐指数
1
解决办法
116
查看次数

从汇编过程写入返回值时出现意外页面错误

我正在尝试混合汇编(x86)和C++。我用汇编语言编写了一个过程,然后从 C++ 中调用它。

但是,当将返回值写入局部变量时,我收到写入权限冲突错误。

#include <iostream>


// will return 1 if all ok and 0 if b is 0
extern "C" int integerMulDiv(int a, int b, int* prod, int* quo, int* rem);

int main() {
    int a = 13, b = 4;
    int p, q, r;

    int res = integerMulDiv(a, b, &p, &q, &r);
    std::cout << p << '\t' << q << '\t' << r << std::endl;
    std::cout << res << std::endl << std::endl;

    res = integerMulDiv(31, 0, …
Run Code Online (Sandbox Code Playgroud)

c++ x86 assembly masm visual-studio

2
推荐指数
1
解决办法
121
查看次数