我在程序集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) 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 …
我想制作一个程序,该程序需要用户输入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) 我目前正在使用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)
上面的代码显示输出字符串而不输出数组吗?
我正在尝试编写一个程序,用于将 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)
我正在编写一个汇编程序和一个 C 程序;C 程序将调用一个用汇编编写的函数。环境是 Ubuntu 18.04LTS x64。
它是为 32 位 x86 设计的,将由 NASM 编译,但无法传递正确的参数。
为了简化问题,我只是改变了我的函数来获得a和b的总和。
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和 …
我目前正在编写一些 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-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) 考虑以下:
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) 我一直在模拟 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)