小编Sep*_*and的帖子

汇编中的float数组

我在程序集x86中实现一个函数,从C程序调用,添加一个float数组.函数的第一个参数是指向数组的指针,第二个参数是元素的数量.当我在linux中运行代码时,我遇到了分段错误.我做错了什么?

.text
.globl floatsum

floatsum:
push %ebp
movl %esp, %ebp

movl  8(%ebp), %eax
movl 12(%ebp), %edx
shrl $2, %edx

xorps %xmm0, %xmm0
loop:
testl %edx, %edx
je end  
movaps (%eax), %xmm1
addps %xmm1, %xmm0
addl $16, %eax
decl %edx
jmp loop 

end:
                            #         3       2      1       0
movaps %xmm0, %xmm1         # xmm0:   w       z      y       x 
                            # xmm1:   z       w      x       y
shufps $0xb1, %xmm1, %xmm1  #        10      11      00      01  = 0xb1
addps  %xmm1, %xmm0         # xmm0:  w+z     z+w …
Run Code Online (Sandbox Code Playgroud)

c x86 assembly sse simd

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

x86 CMP instruction not working for a single word comparison

I am having troubles with the CMP instruction when comparing single words (2 bytes).
The following is my main.asm:

[org 0x7c00]

mov bx, HELLO_MSG
call print_string

mov bx, GOODBYE_MSG
call print_string

jmp $

%include "print_string.asm"

; Data
HELLO_MSG:
    db 'Hello, World!', 0
GOODBYE_MSG:
    db 'Goodbye!', 0
Run Code Online (Sandbox Code Playgroud)

This is the print_string.asm file:

print_string:
    pusha
    mov ah, 0x0e
    loop:
        call print_char
        cmp word [bx], 0
        jne loop
    popa
    ret

print_char:
    mov al, [bx]
    int 0x10
    add bx, 1
    ret
Run Code Online (Sandbox Code Playgroud)

This code …

x86 assembly qemu bootloader x86-16

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

将值保存在汇编中的var字节中

我想制作一个程序,该程序需要用户输入10个字符并将其保存在矢量DATA中,但出现错误

无法添加相对数量

mov byte ptr DATA[pos], al当我尝试保存的价值。
如何解决这个错误?

 .model small
 .stack 100h
 .data
   DATA db 10 dup(?)
   cont db 010h
   pos db 0h
   msg db 10,13,7, 'Input: ', '$'

.code
 mov ax, @data
 mov ds, ax
 mov es, ax

mov ah, 09h
lea dx, msg
int 21h

cicle:  
  mov ah, 01h
  int 21h

  mov byte ptr DATA[pos], al   ;Save ASCII char in position pos in DATA

  inc pos
  dec cont 
jnz cicle
Run Code Online (Sandbox Code Playgroud)

assembly tasm x86-16

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

汇编语言中String和Array之间的区别

我目前正在使用MASM在DOSBox上进行汇编编程(16位)。

我所知道的是:

这是您声明字符串的方式:

var db 'abcde'
Run Code Online (Sandbox Code Playgroud)

这是您声明数组的方式:

var db 'a','b','c'
Run Code Online (Sandbox Code Playgroud)

我不确定这些是否正确,并且我对这两者(数组和字符串)感到困惑

mov ah,9
int 21h
Run Code Online (Sandbox Code Playgroud)

上面的代码显示输出字符串而不输出数组吗?

arrays string assembly masm x86-16

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

如何在 gwbasic 中编写自然数加 1 到 100 的程序?

我正在尝试编写一个程序,用于将 1 到 n 的自然数相加(1 + 2 + 3 + ... + n)。但是,当我使用语句时,总和显示为1 if。当我使用for-next语句时,出现我不明白的语法错误。

if:

30 let s = 0
40 let i = 1
50 s = s + i
60 i = i + 1
70 if i<=n, then goto 50
80 print s
Run Code Online (Sandbox Code Playgroud)

for-next:

30 let i, s
40 s = 0
50 for i = 1 to n
60 s = s + i
70 next i
80 print n
Run Code Online (Sandbox Code Playgroud)
  1. 当我取 …

for-loop if-statement gw-basic

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

在推入/弹出其他寄存器的同时访问相对于 EBP 的堆栈中的函数参数?

我正在编写一个汇编程序和一个 C 程序;C 程序将调用一个用汇编编写的函数。环境是 Ubuntu 18.04LTS x64。

它是为 32 位 x86 设计的,将由 NASM 编译,但无法传递正确的参数。

为了简化问题,我只是改变了我的函数来获得ab的总和。

extern int FindPattern(int a,int b);

int result;
result=FindPattern(1,1);
printf("%d\n",result);
Run Code Online (Sandbox Code Playgroud)
global FindPattern
 section .text
FindPattern:
    push    ebp
    push    esi
    push    edi
    push    ebx
    push    edx
    push    ecx
    
    mov     ebp,esp
    mov     esi,[ebp+8]     ; a
    mov     edi,[ebp+12]    ; b
    mov     eax,0
    add     eax,esi
    add     eax,edi         ; return a+b
    
    pop     ecx
    pop     edx
    pop     ebx
    pop     edi               
    pop     esi
    pop     ebp
    ret          
Run Code Online (Sandbox Code Playgroud)

该函数只是将a和 …

c x86 assembly nasm calling-convention

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

堆栈参数正在使用 C 调用约定在汇编中消失

我目前正在编写一些 x86 汇编代码,并使用as和将其与 glibc 链接ld

    .section .data

str1:
    .asciz "\n"

str3:
    .asciz "Hello"

str4:
    .asciz "Goodbye"

str5:
    .asciz "Guten Tag!"

str6:
    .asciz "Guten Morgen!"


    .section .bss
    .section .text
    .globl _start

_start:
    call main
    movl %eax, %ebx
    movl $1, %eax
    int $0x80

# void writeLine(char*);

    .type writeLine, @function
writeLine:
    pushl %ebp
    movl %esp, %ebp
    movl $str1, %ecx
    pushl %ecx
    movl 8(%ebp), %ecx
    pushl %ecx
    call strcat
    movl %eax, %ecx
    pushl %ecx
    call puts
    popl %ebx
    .leaver1:
    movl …
Run Code Online (Sandbox Code Playgroud)

x86 assembly gnu-assembler libc calling-convention

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

为什么汇编代码在添加到总和之前将值从 %edx 复制到 %rcx?

使用 x86-64 gcc -Og -std=gnu99 -xc 编译。

.L3 ( addl (%rdi,%rcx,4), %eax)的第二行中,为什么不直接%edx在加和时使用寄存器?

addl (%rdi,%edx,4), %eax

int sum_arr(int arr[], int nelems) {
  int sum = 0;
  for (int i = 0; i < nelems; i++) {
    sum += arr[i];
  }
  return sum;
}

sum_arr:
        movl    $0, %edx
        movl    $0, %eax
        jmp     .L2
.L3:
        movslq  %edx, %rcx
        addl    (%rdi,%rcx,4), %eax
        addl    $1, %edx
.L2:
        cmpl    %esi, %edx
        jl      .L3
        rep ret
Run Code Online (Sandbox Code Playgroud)

c arrays assembly gcc x86-64

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

为什么 clang 的尾声使用 `add $N, %rsp` 而不是 `mov %rbp, %rsp` 来恢复 `%rsp`?

考虑以下:

ammarfaizi2@integral:/tmp$ vi test.c
ammarfaizi2@integral:/tmp$ cat test.c

extern void use_buffer(void *buf);

void a_func(void)
{
    char buffer[4096];
    use_buffer(buffer);
}

__asm__("emit_mov_rbp_to_rsp:\n\tmovq %rbp, %rsp");

ammarfaizi2@integral:/tmp$ clang -Wall -Wextra -c -O3 -fno-omit-frame-pointer test.c -o test.o
ammarfaizi2@integral:/tmp$ objdump -d test.o

test.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <emit_mov_rbp_to_rsp>:
   0: 48 89 ec              mov    %rbp,%rsp
   3: 66 2e 0f 1f 84 00 00  cs nopw 0x0(%rax,%rax,1)
   a: 00 00 00 
   d: 0f 1f 00              nopl   (%rax)

0000000000000010 <a_func>:
  10: 55                    push   %rbp
  11: 48 …
Run Code Online (Sandbox Code Playgroud)

assembly x86-64 clang micro-optimization

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

IBM 5150 - int 21h 损坏段寄存器

我一直在模拟 IBM 5150、PC-DOS 1.0、IBM Macro Assembler 1.0 上进行汇编。(86框3.7.1)

我从一个简单的“Hello World”开始:

stack    segment   stack                                                        
         db        80h dup(?)                                                   
stack    ends                                                                   
                                                                                
data     segment                                                                
msg      db        'Hello World!',13,10,'$'                                     
data     ends                                                                   
                                                                                
code     segment                                                                
         assume    cs:code,ds:data                                              
         mov       dx, seg msg                                                  
         mov       ds, dx                                                       
         mov       dx, offset msg                                               
         mov       ah, 09h                                                      
         int       21h                                             
         int       20h                                                          
code     ends                                                                   
                                                                                
         end
Run Code Online (Sandbox Code Playgroud)

遗憾的是,程序在输出后崩溃了。通过调试我发现,在 21h 中断之后,DS、CS 和 IP 寄存器被损坏。

a:debug hello.exe
-r
AX=0000  BX=0000  CX=0000  DX=0000  SP=0080  BP=0000  SI=0000  DI=0000  
DS=049F  ES=049F  SS=04B1  CS=04AF  IP=0000   NV UP DI PL NZ …
Run Code Online (Sandbox Code Playgroud)

x86 assembly dos masm x86-16

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